Java 8时间包的Spring批量序列化问题

Ber*_* S. 10 java spring xstream spring-batch java-time

我有一个Spring批处理应用程序,它在JobExecutionContext中存储了几个Java 8时间对象.我正在使用JobRespository的默认序列化程序.在解析出正在写入BATCH_STEP_EXECUTION_CONTEXT表的数据时,我遇到异常.我有一个LocalDateTime存储为:

{
    "@resolves-to": "java.time.Ser",
    "byte": [5,
    8,
    18,
    8,
    45,
    50],
    "int": [2015,
    10000000]
}
Run Code Online (Sandbox Code Playgroud)

当我尝试从以前的JobExecution数据中读取时,这会导致异常:

Caused by: java.lang.ClassCastException: java.lang.Byte cannot be cast to java.lang.Integer
at com.thoughtworks.xstream.core.util.CustomObjectInputStream.readInt(CustomObjectInputStream.java:144) ~[xstream-1.4.8.jar:1.4.8]
at java.time.LocalDate.readExternal(LocalDate.java:2070) ~[na:1.8.0_45]
at java.time.LocalDateTime.readExternal(LocalDateTime.java:2002) ~[na:1.8.0_45]
at java.time.Ser.readInternal(Ser.java:259) ~[na:1.8.0_45]
at java.time.Ser.readExternal(Ser.java:246) ~[na:1.8.0_45]
at com.thoughtworks.xstream.converters.reflection.ExternalizableConverter.unmarshal(ExternalizableConverter.java:167) ~[xstream-1.4.8.jar:1.4.8]
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) ~[xstream-1.4.8.jar:na]
... 97 common frames omitted
Run Code Online (Sandbox Code Playgroud)

我正在使用Spring-batch 3.0.5.RELEASE.我也尝试升级到最新版本的xstream(1.4.8)和Jettison(1.3.7),但我得到了同样的例外.

这似乎是XStream(链接)的已知问题.建议是在XStream中注册自定义转换器.但是,spring-batch不会公开实际的XStream对象以注册转换器.有关如何进行的任何建议?

Mic*_*lla 3

Spring Batch 允许您通过ExecutionContext实现ExecutionContextSerializer接口并将其注入到JobRepositoryFactoryBean.

您是对的,我们目前不允许您注入自己的 XStream 实例(尽管鉴于此问题,它似乎是一个合理的扩展点)。目前,您必须扩展或复制XStreamExecutionContextStringSerializer并使用您自己的 XStream 实例。