CrĂ©ation d'un gĂ©nĂ©rateur de requĂȘtes personnalisĂ© dans Spring Data Neo4j (partie 1)

Pour commencer, la tĂąche consistait Ă  gĂ©nĂ©rer des requĂȘtes de chiffrement pour les classes de donnĂ©es basĂ©es sur les @NodeEntity , @RelationshipEntity et @Relationship et des paramĂštres supplĂ©mentaires. Un gĂ©nĂ©rateur de requĂȘte a Ă©tĂ© Ă©crit, mais la chaĂźne de requĂȘte a Ă©tĂ© calculĂ©e lors de l'exĂ©cution et nous ne pouvions pas l'utiliser comme paramĂštre de l'annotation @Query existante, donc une nouvelle annotation @CustomQuery Ă©tĂ© ajoutĂ©e, dont le processeur a utilisĂ© un gĂ©nĂ©rateur de requĂȘte Ă©crit.


Versions des logiciels utilisés:


spring-data-neo4j - 5.0.9.RELEASE
neo4j - 3.4.6
neo4j-ogm - 3.1.4


Ajout d'un gĂ©nĂ©rateur de requĂȘtes personnalisĂ© Ă  Spring Data Neo4j


Pour ajouter votre propre mĂ©canisme de gĂ©nĂ©ration de requĂȘtes de chiffrement pour les mĂ©thodes de rĂ©fĂ©rentiel neo4j marquĂ©es, par exemple, avec l'annotation @CustomQuery , @CustomQuery devez crĂ©er la CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory et redĂ©finir la mĂ©thode getQueryLookupStrategy en elle; elle doit renvoyer une nouvelle requĂȘte d' CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy requĂȘte CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy


 @Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); } 

Vous devez également étendre la classe Neo4jRepositoryFactoryBean standard Neo4jRepositoryFactoryBean nouvelle classe CustomNeo4jRepositoryFactoryBean et remplacer la méthode createRepositoryFactory . Il doit renvoyer une instance de la nouvelle fabrique de référentiels:


 @Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); } 

Pour que Spring Data Neo4j comprenne quel bean de fabrique de rĂ©fĂ©rentiels utiliser, il doit ĂȘtre explicitement spĂ©cifiĂ© dans l'annotation @EnableNeo4jRepositories dans la configuration:


 @EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class) 

Une annotation de requĂȘte CustomQuery supplĂ©mentaire a Ă©tĂ© CustomQuery . Si la mĂ©thode de rĂ©fĂ©rentiel est marquĂ©e avec cette annotation, alors CustomGraphQueryLookupStrategy dans la mĂ©thode resolveQuery substituĂ©e resolveQuery l'objet de notre demande 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 implĂ©mente une mĂ©thode getQuery qui renvoie un objet Query ; son constructeur accepte une requĂȘte de chiffrement qui a Ă©tĂ© construite dans CustomGraphRepositoryQuery sur la base des donnĂ©es de l'annotation CustomQuery et de l'objet Method marquĂ© avec cette annotation:


 @Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); } 

La resolveParametres(Object[]) et la resolveParametres(Object[]) utilise sont privĂ©es dans GraphRepositoryQuery , elles ont donc Ă©tĂ© simplement copiĂ©es dans CustomGraphRepositoryQuery (vous pouvez utiliser la rĂ©flexion, cela n'affectera pas les performances, car la gĂ©nĂ©ration de requĂȘtes se produit avant l'exĂ©cution).


Conclusion


Ainsi, vous pouvez dĂ©clarer votre propre mĂ©canisme pour gĂ©nĂ©rer des requĂȘtes de chiffrement, si nĂ©cessaire.


Les articles suivants dĂ©criront le gĂ©nĂ©rateur de requĂȘtes lui-mĂȘme, ses paramĂštres, le mĂ©canisme de travail, les problĂšmes rencontrĂ©s et leur solution.

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


All Articles