是否可以将Neo4j OGM转换器用作Spring @Component?

时间:2015-12-11 21:39:23

标签: neo4j converter spring-data-neo4j-4 neo4j-ogm

我有一个注释为@Component的自定义转换器,它依赖于MyBean,它是由Spring在启动时通过@Autowired注入的。

MyEntity有一个由该转换器转换的字段MyObject。一旦从Neo4j检索MyEntity,OGM将从MyObjectToStringConverter调用toEntityAttribute。但是,我正在获得NPE。似乎OGM不重用我的Spring创建的转换器,MyBean依赖项总是为NULL。

OGM能否从Spring上下文中获取转换器?

有没有办法可以通过OGM初始化MyBean?

如果没有,我可以通过myselft注册转换器吗?

@NodeEntity
class MyEntity {

    @Convert(MyObjectToStringConverter.class)
    private MyObject myObject;
    ...
}

@Component
class MyObjectToStringConverter implements AttributeConverter<MyObject, String> {

    @Autowired
    private MyBean myBean;

    @Override
    public String toGraphProperty(MyObject value) {
        return value.getName();
    }

    @Override
    public MyObject toEntityAttribute(String value) {
        return myBean.convert(value); // myBean is NULL
    }
}

...
repository.find(myEntityID) // NPE from MyObjectToStringConverter


java.lang.NullPointerException: null
    at org.myproject.mvc.converter.MyObjectToStringConverter.toEntityAttribute(MyObjectToStringConverter.java:25) 
    at org.myproject.mvc.converter.MyObjectToStringConverter.toEntityAttribute(MyObjectToStringConverter.java:12) 
    at org.neo4j.ogm.entityaccess.FieldWriter.write(FieldWriter.java:64) 
    at org.neo4j.ogm.mapper.GraphEntityMapper.writeProperty(GraphEntityMapper.java:162) 
    at org.neo4j.ogm.mapper.GraphEntityMapper.setProperties(GraphEntityMapper.java:127) 
    at org.neo4j.ogm.mapper.GraphEntityMapper.mapNodes(GraphEntityMapper.java:108) 
    at org.neo4j.ogm.mapper.GraphEntityMapper.mapEntities(GraphEntityMapper.java:92) 
    at org.neo4j.ogm.mapper.GraphEntityMapper.map(GraphEntityMapper.java:67) 
    at org.neo4j.ogm.session.response.SessionResponseHandler.loadById(SessionResponseHandler.java:161) 
    at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:45) 
    at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:36) 
    at org.neo4j.ogm.session.Neo4jSession.load(Neo4jSession.java:99) 
    at org.springframework.data.neo4j.repository.GraphRepositoryImpl.findOne(GraphRepositoryImpl.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:483) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:468) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:440) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) 
    at com.sun.proxy.$Proxy87.findOne(Unknown Source) 
    at org.myproject.mvc.service.AbstractService.find(AbstractService.java:40)

1 个答案:

答案 0 :(得分:1)

OGM不会从Spring上下文中获取转换器 - 它在Spring上根本没有依赖关系。也许您可以使用Springs ConversionService?

{{3}}