Spring Batch,JdbcExecutionContextDao java.util.Map $ Entry deserializer issue,xstream 1.4.1

我使用Spring Batch 2.1.9时遇到问题:当我使用jobExplorer.getJobExecution(jobExecutionId)时 ,我发现DAO必须反序列化字符串时出现问题:

{"map":[{"entry":{"string":"parsedComparingDate","date":"2014-03-08 23:00:00.0 UTC"}}]} 

BATCH_JOB_EXECUTION_CONTEXT表中,使用方法JdbcJobExecutionDao.getJobExecution()

我知道春季批次使用xstream 1.3,但在我的Pom中,我有:

  • 春季批次2.1.9 ;
  • xstream 1.4.1 (inheritance自smooks);
  • jettison 1.3.3 (inheritance自cxf);

此外,我读到xstream 1.3不能正常使用jettison 1.3.3,但使用xstream 1.3(不包括pom的xstream 1.4.1)工作正常,而使用xstream 1.4.1或major,我发现以下exception:

 Caused by: java.lang.InstantiationError: java.util.Map$Entry at sun.reflect.GeneratedSerializationConstructorAccessor1.newInstance(Unknown Source) [:1.6.0_23] at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [rt.jar:1.6.0_23] at com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider.newInstance(Sun14ReflectionProvider.java:75) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:424) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:229) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:71) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.converters.collections.MapConverter.putCurrentEntryIntoMap(MapConverter.java:85) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:77) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:71) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.converters.collections.MapConverter.unmarshal(MapConverter.java:66) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1035) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1019) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.XStream.fromXML(XStream.java:895) [xstream-1.4.1.jar:] at com.thoughtworks.xstream.XStream.fromXML(XStream.java:886) [xstream-1.4.1.jar:] at org.springframework.batch.core.repository.dao.XStreamExecutionContextStringSerializer.deserialize(XStreamExecutionContextStringSerializer.java:48) [spring-batch-core-2.1.9.RELEASE.jar:] at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:222) [spring-batch-core-2.1.9.RELEASE.jar:] at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:215) [spring-batch-core-2.1.9.RELEASE.jar:] at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:649) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:714) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.query(SimpleJdbcTemplate.java:202) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.query(SimpleJdbcTemplate.java:209) [org.springframework.jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE] at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao.getExecutionContext(JdbcExecutionContextDao.java:106) [spring-batch-core-2.1.9.RELEASE.jar:] 

1)我已经看过代码,我可以配置XStreamExecutionContextStringSerializer以设置reflectionProvider = null (这样,它不会使用Provider)?

2)还有其他解决方案可以解决我的问题吗?

谢谢

我不可能更改xstream版本和jettison版本,因为它们是由其他组件(如smooks)导入的。

一个可能的解决方案可能是创建两个不同的JBoss模块并使用它们来实现。

所以,我找到另一个解决方案:使用spring-batch 2.2.0.RELEASE ,并使用org.springframework.batch.core.repository.dao.DefaultExecutionContextSerializer作为序列化器而不是XStream

配置下方:

            

我测试了它并且工作正常,所以,我认为这是最好的解决方案。

由于Jettison 1.2+与XStream的不兼容性,升级XStream将导致Spring Batch中断。 这是最近确定的但尚未解决的问题。 您的问题的解决方案是使用Jettison 1.2和XStream 1.4.7

我正在使用带有Spring Batch 3.0.7的Spring Boot 1.4.0,并使用一个使用Netflix OSS组件的微服务遇到了这个问题,他们使用的是XStreams 1.4.2。

我也使用Java配置而不是XML。 以下是我提出的解决问题的方法:在@Configuration类中:

  @Bean public ExecutionContextSerializer serializer() { return new Jackson2ExecutionContextStringSerializer(); } @Bean @Autowired public JobRepository jobRepository( DataSource dataSource, PlatformTransactionManager txManager ) throws Exception { JobRepositoryFactoryBean fac = new JobRepositoryFactoryBean(); fac.setDataSource( dataSource ); fac.setTransactionManager( txManager ); fac.setSerializer( serializer() ); fac.afterPropertiesSet(); return fac.getObject(); } @Bean @Autowired public JobExplorer jobExplorer( DataSource dataSource ) throws Exception { JobExplorerFactoryBean fac = new JobExplorerFactoryBean(); fac.setDataSource( dataSource ); fac.setSerializer( serializer() ); fac.afterPropertiesSet(); return fac.getObject(); } 

我使用Postgres作为后备存储,因此DefaultExecutionContextSerializer无法正常工作,因为它尝试序列化二进制而不是UTF-8(JSON)。