Criando um gerador de consultas personalizado no Spring Data Neo4j (parte 1)

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.

Source: https://habr.com/ru/post/pt434902/


All Articles