Java JAXB日期编组问题

Java JAXB日期编组问题,java,date,jaxb,timezone,Java,Date,Jaxb,Timezone,我有一个构建响应对象的大型web服务,它依赖于JAXB将响应对象编组到要返回的最终XML。在该对象中,我有许多日期字段。有些日期字段不能包含时区信息,有些则可以(基于奇怪的业务规则) 在多年未更改的代码中,对于不能包含TZ信息的日期,我们有一个自定义类型适配器来执行我们需要的操作。对于所有其他字段,我们让JAXB替我们处理:封送和解封日期以包含TZ信息 对于每一个新版本的服务,我们都有一个自定义的回归系统,以确保响应中没有一个字节与已知的良好响应不同。在我们最近的构建中,我们遇到了一个问题,即在

我有一个构建响应对象的大型web服务,它依赖于JAXB将响应对象编组到要返回的最终XML。在该对象中,我有许多日期字段。有些日期字段不能包含时区信息,有些则可以(基于奇怪的业务规则)

在多年未更改的代码中,对于不能包含TZ信息的日期,我们有一个自定义类型适配器来执行我们需要的操作。对于所有其他字段,我们让JAXB替我们处理:封送和解封日期以包含TZ信息

对于每一个新版本的服务,我们都有一个自定义的回归系统,以确保响应中没有一个字节与已知的良好响应不同。在我们最近的构建中,我们遇到了一个问题,即在预期TZ的日期定期出现,但它丢失了:

Old Value:2014-05-14T08:24:20.283-04:00
New Value:2014-05-14T08:24:20.283Z
令人沮丧的是,当我们再次为失败的请求运行测试时,测试第二次通过:这意味着TZ回来了。当错误无法按需复制时,调试非常困难

在代码中我找不到任何地方,在所有依赖项中,系统都在不断更改JVM时区,或者我可以找到的默认格式(Locale.setDefault)

有人见过这种类型的JAXB与日期不一致吗

我们可以编写另一个自定义适配器,强制从编组到/从编组到具有TZ。。。但我只是不明白,为什么经过多年的使用,现在突然决定改变我们

更新 这是新的适配器。没什么特别的。但是,正如我所说,这个问题发生在添加这个适配器之前。添加后,我不知道是否解决了。。。还没有时间测试

public class CustomDateTimeTZAdapter extends XmlAdapter<String, Date>{
    private static DateFormat getFormatter() {
        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); // <---------------- NOTE:  The "XXX" for Timezone is only JAVA 7+ supported!
    }
    @Override
    public Date unmarshal(String v) throws Exception {
        try {
            return getFormatter().parse(v);
        } catch (ParseException e) {
            return null;
        }
    }

    @Override
    public String marshal(Date v) throws Exception {
        if (v != null) {
            return getFormatter().format(v);
        } else {
            return null;
        }
    }

}
公共类CustomDateTimeTZAdapter扩展了XmlAdapter{
私有静态日期格式getFormatter(){

返回新的SimpleDataFormat(“yyyy-MM-dd'HH:MM:ss.SSSXXX”);//但是以“Z”结尾的日期-时间字符串确实包含时区-它与+00:00或-00:00相同。您显示的字符串确实是不同的时间点,但如果小时字段的值也更改为正确的小时,则一切正常。-请确认/否认“不同”是否正确值只是表示不同或实际上不同的值。因此,您在“代码>日期java”中,将代码中的TZ保持日期解压缩,如<代码> java. UTIL.DATE < /C> >但不处理时区。考虑发布您的自定义适配器。实际上,我首先会责备默认的TZ,但是很难在不看到适配器代码的情况下说。。数据通过MyBatis层来自MSSQL数据库。在该数据库中,准确地说是“2014-05-14T08:24:20.283”,但正如您所知,MSSQL不支持时区。唯一能拯救我们的是数据库、web服务器和最初写入数据库的系统都在东部时间(标准或节省取决于一年中的时间)。因此,听起来我可能一直在责怪JAXB,但可能存在MyBatis问题。最大的问题是它不一致。我将发布新的适配器代码,但如果MyBatis是责怪的话,它可能无法解决。@lexicore,我的想法是一样的。日期只是一个日期(从纪元开始算起的秒数或其他时间)。因此,在TZ不准确的地方编组时,它是从日期到字符串的转换。JVM TZ不再是东方的。我只是不知道如何/在哪里发生这种情况。我想在我的适配器中我可以捕捉到它。。。