Zunächst bestand die Aufgabe @NodeEntity
, @RelationshipEntity
für Datenklassen basierend auf den @NodeEntity
, @RelationshipEntity
und @Relationship
sowie zusätzlichen Parametern zu generieren. Ein Abfragegenerator wurde geschrieben, aber die Abfragezeichenfolge wurde zur Laufzeit berechnet und konnte nicht als Parameter der vorhandenen @Query
Annotation verwendet werden. @Query
wurde eine neue @CustomQuery
Annotation hinzugefügt, deren Prozessor einen geschriebenen @CustomQuery
verwendete.
Versionen der verwendeten Software:
spring-data-neo4j - 5.0.9.RELEASE
neo4j - 3.4.6
neo4j-ogm - 3.1.4
Hinzufügen eines benutzerdefinierten Abfragegenerators zu Spring Data Neo4j
Um Ihren eigenen Mechanismus zum Generieren von Verschlüsselungsanforderungen für neo4j-Repository-Methoden hinzuzufügen, die beispielsweise mit der Annotation @CustomQuery
, müssen @CustomQuery
die CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
erstellen, die CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
und die Methode CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
neu definieren. Sie sollte eine neue Abfrageanalyse CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy
@Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); }
Es ist auch erforderlich, die Standardklasse Neo4jRepositoryFactoryBean
neue Klasse CustomNeo4jRepositoryFactoryBean
und die Methode CustomNeo4jRepositoryFactoryBean
überschreiben. Es sollte eine Instanz der neuen Repository-Factory zurückgeben:
@Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); }
Damit Spring Data Neo4j versteht, welche Repository-Factory-Bean verwendet werden soll, muss dies in der Annotation @EnableNeo4jRepositories
in der Konfiguration explizit angegeben werden:
@EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class)
Eine zusätzliche Annotation für CustomQuery
Abfragen wurde CustomQuery
. Wenn die Repository-Methode mit dieser Anmerkung gekennzeichnet ist, gibt CustomGraphQueryLookupStrategy
in der Methode override resolveQuery
das Objekt unserer Anforderung zurück. 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
implementiert eine getQuery
Methode, die ein Query
Objekt zurückgibt. Der Konstruktor akzeptiert eine Cypher-Abfrage, die in CustomGraphRepositoryQuery
basierend auf den Daten aus der CustomQuery
Annotation und dem mit dieser Annotation gekennzeichneten Method
Objekt erstellt wurde:
@Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); }
Die Methode resolveParametres(Object[])
und resolveParametres(Object[])
die von ihr verwendet werden, sind in GraphRepositoryQuery
, sodass sie einfach in CustomGraphRepositoryQuery
kopiert CustomGraphRepositoryQuery
(Sie können Reflection verwenden, dies hat keinen Einfluss auf die Leistung, da die Anforderungsgenerierung vor der Laufzeit erfolgt).
Fazit
Auf diese Weise können Sie bei Bedarf Ihren eigenen Mechanismus zum Generieren von Verschlüsselungsanforderungen deklarieren.
In den folgenden Artikeln werden der Abfragegenerator selbst, seine Parameter, der Arbeitsmechanismus, die aufgetretenen Probleme und ihre Lösung beschrieben.