Para começar, surgiu a tarefa de gerar solicitações criptografadas para classes de dados com base nas @NodeEntity
, @RelationshipEntity
e @Relationship
e parâmetros adicionais. Um gerador de consultas foi gravado, mas a sequência de consultas foi calculada em tempo de execução e não pudemos usá-la como parâmetro da anotação @Query
existente; portanto, uma nova anotação @CustomQuery
foi adicionada, cujo processador utilizava um gerador de consultas por escrito.
Versões do software usado:
spring-data-neo4j - 5.0.9.RELEASE
neo4j - 3.4.6
neo4j-ogm - 3.1.4
Adicionando um gerador de consultas personalizado ao Spring Data Neo4j
Para adicionar seu próprio mecanismo para gerar solicitações de criptografia para métodos de repositório neo4j marcados, por exemplo, com a anotação @CustomQuery
, @CustomQuery
precisa criar a CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
e redefinir o método getQueryLookupStrategy
nela; ele deve retornar uma nova consulta de CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy
consultaLookUploadLanguage
@Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); }
Também é necessário estender a classe Neo4jRepositoryFactoryBean
padrão Neo4jRepositoryFactoryBean
nova classe CustomNeo4jRepositoryFactoryBean
e substituir o método createRepositoryFactory
. Ele deve retornar uma instância da nova fábrica de repositórios:
@Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); }
Para que o Spring Data Neo4j entenda qual bean de fábrica de repositório usar, ele deve ser especificado explicitamente na anotação @EnableNeo4jRepositories
na configuração:
@EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class)
Uma anotação de consulta CustomQuery
adicional foi CustomQuery
. Se o método do repositório estiver marcado com esta anotação, CustomGraphQueryLookupStrategy
no método resolveQuery
substituído retornará o objeto de nossa solicitação CustomGraphRepositoryQuery extends GraphRepositoryQuery
:
public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, ProjectionFactory factory, NamedQueries namedQueries) { if (method.isAnnotationPresent(CustomQuery.class)) { GraphQueryMethod queryMethod = new GraphQueryMethod(method, metadata, factory); return new CustomGraphRepositoryQuery(queryMethod, session, method.getAnnotation(CustomQuery.class)); } else { return super.resolveQuery(method, metadata, factory, namedQueries); } }
CustomGraphRepositoryQuery
implementa um método getQuery
que retorna um objeto Query
; seu construtor aceita uma consulta de criptografia criada em CustomGraphRepositoryQuery
base nos dados da anotação CustomQuery
e no objeto Method
marcado com esta anotação:
@Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); }
O resolveParametres(Object[])
e o resolveParametres(Object[])
usado por ele são privados no GraphRepositoryQuery
; portanto, eles foram simplesmente copiados para CustomGraphRepositoryQuery
(você pode usar a reflexão, isso não afetará o desempenho, porque a geração de consultas ocorre antes do tempo de execução).
Conclusão
Assim, você pode declarar seu próprio mecanismo para gerar solicitações de criptografia, se necessário.
Os artigos a seguir descreverão o próprio gerador de consultas, seus parâmetros, o mecanismo de trabalho, os problemas encontrados e sua solução.