Spring XD 1.2.0+中的MongoDB批处理作业中断

时间:2015-08-05 17:06:56

标签: spring spring-data-mongodb spring-xd

我们在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 applicationNoClassDefFoundError 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可能会自动处理这种情况吗?

2 个答案:

答案 0 :(得分:0)

我不认为我们可以从XD方面做任何事情,因为这是一项自定义工作。我们必须依赖spring-data-mongodb功能。

答案 1 :(得分:0)

看起来你正在遇到DATACMNS-710,这在Fowler SR1中修复(相当于Spring Data MongoDB 1.7.1)。您可能也想尝试just released Gosling release