我们在Spring XD中运行一个批处理作业,它使用标准的MongoItemReader从MongoDB读取,它将mongo记录转换为我们的域模型。直到Spring XD版本1.1.3,这工作正常,但在版本1.2.0和1.2.1中,作业失败,出现以下错误(包名缩短)
java.lang.NoClassDefFoundError: c/s/r/b/b/domain/IndexId at c.s.r.b.b.domain.IndexId_Instantiator_hxmj4p.newInstance(Unknown Source) ~[na:na] at org.springframework.data.convert.BytecodeGeneratingEntityInstantiator$EntityInstantiatorAdapter.createInstance(BytecodeGeneratingEntityInstantiator.java:193) ~ [spring-data-commons-1.10.0.RELEASE.jar:na] at org.springframework.data.convert.BytecodeGeneratingEntityInstantiator.createInstance (BytecodeGeneratingEntityInstantiator.java:76) ~[spring-data-commons-1.10.0.RELEASE.jar:na] at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:250) ~[spring-data-mongodb-1.7.0.RELEASE.jar:na] at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:231) ~[spring-data-mongodb-1.7.0.RELEASE.jar:na]
调查我发现线程NoClassDefFoundError when making a query in spring-data-solr within a play framework application和NoClassDefFoundError after upgrading to 1.7.0.RELEASE表明这是由于spring-data-mongo 1.7.0的变化和基础spring-data-commons改变了默认实体实例化技术,以提高性能。
根据这些线程中建议的修复,我在我的作业模块XML定义中修改了mongo模板,如下所示,这解决了问题:
<bean id="mappingConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg ref="dbRefResolver"/>
<constructor-arg ref="mongoMappingContext"/>
<property name="instantiators" ref="entityInstantiators" />
</bean>
<bean id="dbRefResolver" class="org.springframework.data.mongodb.core.convert.DefaultDbRefResolver">
<constructor-arg ref="mongoDbFactory"/>
</bean>
<bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/>
<bean id="entityInstantiators" class="org.springframework.data.convert.EntityInstantiators">
<constructor-arg value="#{T(org.springframework.data.convert.ReflectionEntityInstantiator).INSTANCE}"/>
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mappingConverter" />
</bean>
然而,这是冗长的,显然不是一个理想的解决方案。问题并没有出现在我们的作业模块集成测试中,所以我有一个预感,它是由默认实体实例化更改和模块在Spring XD中执行的事实引起的,域类将在模块中#39;类加载器,XD主类加载器中的spring数据mongo类不可见。
那么这应该被视为Spring XD或Spring Data Mongo中的错误吗?一个修复可能是对Spring Data Mongo mongo的改进:映射转换器XML配置允许强制使用ReflectionEntityInstantiator,这至少会减少上面所需的XML数量。或者,Spring XD可能会自动处理这种情况吗?
答案 0 :(得分:0)
我不认为我们可以从XD方面做任何事情,因为这是一项自定义工作。我们必须依赖spring-data-mongodb功能。
答案 1 :(得分:0)
看起来你正在遇到DATACMNS-710,这在Fowler SR1中修复(相当于Spring Data MongoDB 1.7.1)。您可能也想尝试just released Gosling release。