1

@Component として注釈が付けられたカスタムコンバーターがあり、ブート時に @Autowired を介して Spring によって注入される MyBean に依存します。

MyEntity には、そのコンバーターによって変換されるフィールド MyObject があります。OGM は、Neo4j から MyEntity を取得するとすぐに、MyObjectToStringConverter から toEntityAttribute を呼び出します。しかし、私はNPEを取得しています。OGM は、Spring によって作成された私のコンバーターを再利用していないようで、MyBean の依存関係は常に NULL です。

OGM は私のコンバーターを Spring コンテキストから取得できるはずですか?

MyBean を OGM で初期化する方法はありますか?

そうでない場合、自分でコンバーターを登録できますか?

@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)
4

1 に答える 1

1

OGM は Spring コンテキストからコンバーターを取得しません。Spring にはまったく依存しません。おそらく、Springs ConversionService を使用できますか?

http://docs.spring.io/spring-data/neo4j/docs/4.0.0.RELEASE/reference/html/#_spring_s_conversionservice

于 2015-12-12T09:28:34.407 に答える