引起原因:java.lang.IllegalArgumentException:无法在 Spring Batch 中反序列化执行上下文

2024-02-29

我正在开发Spring Boot + Batch XML基于的方法。在此示例中,我创建了以下类。当我只是加载或分类 Spring Batch 作业时。我收到以下错误。

我网络搜索链接如下:迁移到 Spring Boot 2 并使用 Spring Batch 4 https://stackoverflow.com/questions/49625231/migration-to-spring-boot-2-and-using-spring-batch-4/49636389#49636389,但这并没有解决我的问题。

谁能指导这里需要应用什么确切的解决方案?

Error:

Caused by: java.lang.IllegalArgumentException: Unable to deserialize the execution context
    at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:325) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:309) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:667) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:605) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:657) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:688) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:756) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao.getExecutionContext(JdbcExecutionContextDao.java:112) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.batch.core.explore.support.SimpleJobExplorer.getJobExecutionDependencies(SimpleJobExplorer.java:202) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.batch.core.explore.support.SimpleJobExplorer.getJobExecutions(SimpleJobExplorer.java:83) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_162]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_162]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_162]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_162]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at com.sun.proxy.$Proxy70.getJobExecutions(Unknown Source) ~[na:na]
    at org.springframework.batch.core.JobParametersBuilder.getNextJobParameters(JobParametersBuilder.java:264) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:162) ~[spring-boot-autoconfigure-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:179) ~[spring-boot-autoconfigure-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:134) ~[spring-boot-autoconfigure-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:128) ~[spring-boot-autoconfigure-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) [spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    ... 5 common frames omitted
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected VALUE_STRING: need JSON String that contains type id (for subtype of java.lang.Object)
 at [Source: (ByteArrayInputStream); line: 1, column: 9] (through reference chain: java.util.HashMap["map"])
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:1498) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.DeserializationContext.reportWrongTokenException(DeserializationContext.java:1273) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._locateTypeId(AsArrayTypeDeserializer.java:151) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:96) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromAny(AsArrayTypeDeserializer.java:71) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserializeWithType(UntypedObjectDeserializer.java:712) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:529) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:364) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3077) ~[jackson-databind-2.9.6.jar:2.9.6]
    at org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer.deserialize(Jackson2ExecutionContextStringSerializer.java:70) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer.deserialize(Jackson2ExecutionContextStringSerializer.java:50) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:322) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    ... 34 common frames omitted

CommonConfig.java

@Configuration
@ComponentScan("com.XXXX")
@EnableBatchProcessing
@EnableScheduling
@PropertySource("classpath:database.properties")
@ImportResource({ "classpath:jobs/XYZ.xml"})
public class CommonConfig {
    @Bean
    BatchConfigurer configurer(@Qualifier("dataSource") DataSource dataSource) {
        return new DefaultBatchConfigurer(dataSource);
    }
}

XYZ.xml

<bean id="databaseConfig" class="com.XX.config.DatabaseConfig" />

    <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

    <bean id="job_Repository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
        <property name="transactionManager" ref="transactionManager" />
    </bean>

    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="job_Repository" />
    </bean>

    <bean id="stepScope" class="org.springframework.batch.core.scope.StepScope">
        <property name="autoProxy" value="true"/>
    </bean>

    <batch:job id="myXYZBatchJob">
        <batch:step id="XYZContextStep" >
            <batch:tasklet ref=XYZContextTasklet" />
        </batch:step>
    </batch:job>
    ......
    ........
</bean>

数据库配置.java

@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.XXX" })
@EnableJpaRepositories(basePackages = {"com.XX.repository", "com.XX.custom.repository"}, 
                        entityManagerFactoryRef = "entityManagerFactory", 
                        transactionManagerRef = "transactionManager")
public class DatabaseConfig {
    @Bean
    @Primary
    @ConfigurationProperties("abc.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "abc.datasource")
    public DataSource dataSource() {
        return dataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("dataSource") DataSource dataSource) {

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan(new String[] { "com.XX.Entity" });
        em.setPersistenceUnitName("devcloud");

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        return em;
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

EDIT-1:我正在使用 Spring Boot 父版本2.0.4.RELEASE,这是最新的。它拉取所有 Spring 版本,包括 Context 版本5.0.8.RELEASE.

要求您发布代码片段和详细描述来支持您的答案。

Edit-2:

public class BillingConfig implements BatchConfigurer{

    private PlatformTransactionManager transactionManager;
    private JobRepository jobRepository;
    private JobLauncher jobLauncher;
    private JobExplorer jobExplorer;

    @Override
    public JobRepository getJobRepository() {
        return jobRepository;
    }

    @Override
    public PlatformTransactionManager getTransactionManager() {
        return transactionManager;
    }

    @Override
    public JobLauncher getJobLauncher() throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {
        return jobLauncher;
    }

    @Override
    public JobExplorer getJobExplorer() {
        return jobExplorer;
    }

    @PostConstruct
    void initialize() throws Exception {
        if (this.transactionManager == null) {
            this.transactionManager = new ResourcelessTransactionManager();
        }

        // A FactoryBean that automates the creation of a SimpleJobRepository using non-persistent in-memory DAO implementations. 
        MapJobRepositoryFactoryBean jobRepositoryFactory = new MapJobRepositoryFactoryBean(this.transactionManager);
        jobRepositoryFactory.afterPropertiesSet();
        this.jobRepository = jobRepositoryFactory.getObject();

        // A FactoryBean that automates the creation of a SimpleJobRepository using non-persistent in-memory DAO implementations. 
        MapJobExplorerFactoryBean jobExplorerFactory = new MapJobExplorerFactoryBean(jobRepositoryFactory);
        jobExplorerFactory.afterPropertiesSet();
        this.jobExplorer = jobExplorerFactory.getObject();
        this.jobLauncher = createJobLauncher();
    }

    private JobLauncher createJobLauncher() throws Exception {
        SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
        simpleJobLauncher.setJobRepository(jobRepository);
        simpleJobLauncher.afterPropertiesSet();
        return simpleJobLauncher;
    }
}

当作业的执行上下文使用版本 3 序列化时(使用XStream默认情况下),然后使用版本 4 反序列化(使用Jackson默认情况下)。因此,要么将 Spring Batch 降级到版本 3,要么配置您的作业存储库以使用XStreamExecutionContextStringSerializer.

在你的例子中,你已经定义了一个 bean 类型BatchConfigurer,这样你就可以覆盖createJobRepository方法并配置 XStream 序列化器。例如:

@Bean
BatchConfigurer configurer(@Qualifier("dataSource") DataSource dataSource, PlatformTransactionManager transactionManager) {
    return new DefaultBatchConfigurer(dataSource) {
        @Override
        protected JobRepository createJobRepository() throws Exception {
            JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
            factory.setDataSource(dataSource);
            factory.setTransactionManager(transactionManager);
            factory.setSerializer(new XStreamExecutionContextStringSerializer());
            factory.afterPropertiesSet();
            return factory.getObject();
        }
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

引起原因:java.lang.IllegalArgumentException:无法在 Spring Batch 中反序列化执行上下文 的相关文章

随机推荐

  • 为什么我的 cookie 设置没有被应用?

    基于这里的答案 如何将 bool 值写入 cookie 或从 cookie 读取 bool 值 https stackoverflow com questions 16765467 how can i write and read bool
  • 直方图或包数据结构的 Objective-C 实现

    我没有实现自己的实现 而是想知道是否有人知道我可以使用的 Objective C 中的直方图或包数据结构实现 本质上 直方图是列表的哈希图 其中列表包含与其哈希条目相关的值 一个很好的例子是超市商品的直方图 您可以将每组商品乳制品 肉类 罐
  • 通过 phpDriver 插入时 Mongodb 2.6 中的 NumberLong

    当你在 Mongo 2 6 中做这样的事情时db test insert a 1 b 2 3 你会得到 id ObjectId a 3 b 2 3 没什么意外的 当我通过 php 做类似的事情时Mongo 2 4 10 with 1 4 5
  • Eclipse 的搜索和替换中的匹配组语法是什么

    在 Eclipse 上执行搜索 替换并使用 匹配组 的语法是什么 是它的名字吗 在 vi 上我执行以下操作 s log log 1 debug g 还有像这样的一行 log Message 替换为 log Message debug Ecl
  • kops - 获取错误的 kubectl 上下文

    I use kops在aws中创建kubernetes集群 我想使用以下命令验证集群 kops validate cluster 标准输出给我 Using cluster from kubectl context minikube 我认为问
  • 为地图分配值的最有效方法

    哪种方式为地图分配值最有效 或者它们都针对相同的代码进行了优化 在大多数现代编译器上 1 Assignment using array index notation Foo Bar 12345 2 Assignment using memb
  • 使用 Rhino 在 Eclipse 中调试 Javascript

    我已经安装了适用于 Eclipse 的 JavaScript 开发工具插件 但无法运行或调试 JavaScript 项目 我想使用内置的 Rhino 解释器进行调试 而不是使用网络浏览器 我创建了一个 JavaScript 项目 当我尝试创
  • PostgreSQL:将lo_import中的内容保存到表中

    主要问题 https stackoverflow com questions 22074987 using pg read file read file in desktop postgresql 我想在 PostgreSQL 中使用 lo
  • 如何使用javascript在jsp中对从数据库生成的html表的列进行求和?

    我正在我的网站上工作 我想通过 jsp 使用 javascript 对 html 表的一列中的值进行求和 我发现了各种可以添加已放入的静态数据的代码 但是当我在代码中使用相同的东西时 它不起作用 JavaScript 如下
  • Python(足球比赛算法烦恼)

    我正在尝试编写足球小组赛的算法 例如 我在舞台上有4支球队 teams team1 team2 team3 team4 然后我得到了一对独一无二的 import itertools team pairs list itertools com
  • 将对象传递给 UITypeEditor

    我目前希望使用 PropertyGrid 来允许用户编辑我的一些类 但是我在将对象传递给他们使用的 UITypeEditor 时遇到了困难 当用户按下下拉菜单时 我想显示一个已加载纹理的列表框以供选择 如果他们想使用应用程序尚未加载的纹理
  • 从SVN迁移后断开GIT分支

    尝试查看几十个帖子 但仍然没有得到我想要的 Preface 我们最初有一个非常大的 SVN 存储库 没有主干 标准结构 等 所以 我正在工作的项目也没有结构 在子文件夹内 我在这个项目上工作了大约几个月 然后遇到了一个情况 我需要一个分支来
  • 仅将变量向下传递到子目录

    如何将项目特定变量传递到子目录 我想知道是否有一种 官方 方式可以做到这一点 CMAKE BUILD TYPE is one of None Debug Release RelWithDebInfo set specific build t
  • 如何使用键盘快捷键移动 Eclipse 选项卡?

    我想在 Eclipse 中移动我的选项卡 如下所示 From this To this 但是使用键盘快捷键 因为每次只是为了重新排序选项卡而使用鼠标执行此操作非常烦人 任何想法 There is no such a shortcut Tab
  • jQuery .on() 方法看不到新元素

    我正在获取一个 JSON 元素并从其项目构建一个列表 如下所示 getTitles function data data data var list getJSON titles data function data each data d
  • 应用程序安装失败:无法写入设备

    在 Xcode 6 3 中 当我尝试在真实设备上运行用 Swift 编写的 iOS 项目时 出现此错误 应用程序安装失败 无法写入设备 我尝试清理项目并再次运行 但出现相同的错误 我该如何修复这个错误 删除设备上的应用程序并再次运行该项目对
  • 如何为 kubernetes 部署提供静态 ELB 端点

    每次我在 kubernates 中部署新版本时 我得到不同的 EXTERNAL IP 在下面的情况下是 afea383cbf72c11e8924c0a19b12bce4 xxxxx us east 1 elb amazonaws com k
  • 无法使用新门户在 Azure AD 中添加 Microsoft 帐户

    我们的一些客户正在使用外部 Microsoft 帐户来访问 AAD 服务 由于我们未与他们的域关联 并且其中一些人使用 Gmail 帐户 因此几乎不可能将他们的整个域添加到我们的 AAD 中 旧门户 manage windowsazure
  • 如何在 Clojure 中按部分生成惰性序列?

    我有一个数据库服务器 我从中获取数据 有时数据有数百万行甚至更多 所以我使用惰性下载 我使用 clojure jdbc 库中的服务器端游标https funcool github io clojure jdbc latest cursor
  • 引起原因:java.lang.IllegalArgumentException:无法在 Spring Batch 中反序列化执行上下文

    我正在开发Spring Boot Batch XML基于的方法 在此示例中 我创建了以下类 当我只是加载或分类 Spring Batch 作业时 我收到以下错误 我网络搜索链接如下 迁移到 Spring Boot 2 并使用 Spring