Para empezar, surgió la tarea de generar solicitudes de cifrado para clases de datos basadas en @NodeEntity
, @RelationshipEntity
y @Relationship
y parámetros adicionales. Se escribió un generador de consultas, pero la cadena de consulta se calculó en tiempo de ejecución y no pudimos usarla como un parámetro de la anotación @Query
existente, por lo que se agregó una nueva anotación @CustomQuery
, cuyo procesador utilizó un generador de consultas escritas.
Versiones de software usado:
spring-data-neo4j - 5.0.9.
neo4j - 3.4.6
neo4j-ogm - 3.1.4
Agregar un generador de consultas personalizado a Spring Data Neo4j
Para agregar su propio mecanismo para generar solicitudes de cifrado para los métodos de repositorio neo4j marcados, por ejemplo, con la anotación @CustomQuery
, debe crear la CustomNeo4jRepositoryFactory extends Neo4jRepositoryFactory
y redefinir el método getQueryLookupStrategy
en ella; debería devolver una nueva consulta de CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy
consulta CustomGraphQueryLookupStrategy extends GraphQueryLookupStrategy
@Override protected Optional<QueryLookupStrategy> getQueryLookupStrategy(QueryLookupStrategy.Key key, EvaluationContextProvider evaluationContextProvider) { return Optional.of(new CustomGraphQueryLookupStrategy(session)); }
También es necesario extender la clase estándar Neo4jRepositoryFactoryBean
nueva clase CustomNeo4jRepositoryFactoryBean
y anular el método createRepositoryFactory
. Debería devolver una instancia de la nueva fábrica de repositorios:
@Override protected RepositoryFactorySupport createRepositoryFactory(Session session) { return new CustomNeo4jRepositoryFactory(session); }
Para que Spring Data Neo4j entienda qué bean de fábrica de repositorios usar, debe especificarse explícitamente en la anotación @EnableNeo4jRepositories
en la configuración:
@EnableNeo4jRepositories(..., repositoryFactoryBeanClass = CustomNeo4jRepositoryFactoryBean.class)
Se ha CustomQuery
anotación de consulta CustomQuery
adicional. Si el método de repositorio está marcado con esta anotación, CustomGraphQueryLookupStrategy
en el método de resolveQuery
sobrescritura devolverá el objeto de nuestra solicitud 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 un método getQuery
que devuelve un objeto Query
; su constructor acepta una consulta CustomGraphRepositoryQuery
que se creó en CustomGraphRepositoryQuery
en función de los datos de la anotación CustomQuery
y el objeto Method
marcado con esta anotación:
@Override protected Query getQuery(Object[] parameters) { return new Query(query, resolveParams(parameters)); }
El resolveParametres(Object[])
y el resolveParametres(Object[])
usa son privados en GraphRepositoryQuery
, por lo que simplemente se copiaron en CustomGraphRepositoryQuery
(puede usar la reflexión, esto no afectará el rendimiento, ya que la generación de consultas se produce antes del tiempo de ejecución).
Conclusión
Por lo tanto, puede declarar su propio mecanismo para generar solicitudes de cifrado, si es necesario.
Los siguientes artículos describirán el generador de consultas en sí, sus parámetros, el mecanismo de trabajo, los problemas encontrados y su solución.