【问题标题】:jaxb XML marshaling need to format date differentlyjaxb XML 编组需要以不同的方式格式化日期
【发布时间】:2016-04-23 11:01:27
【问题描述】:

我们需要在从 jax-rs webservice 返回的 XML 期间以不同的方式格式化日期字段。

例如

Class Dates {
    Date date1; //in xml this date must be in format dd-mon-yyyy
    Date date2; // in xml this date must be in format dd-mm-yyyy hh:ss sss
} 

我们尝试了 XMLAdapter,但我们无法确定它是用于字段 date1 还是 date2

请指教。如果有任何其他过滤器或事件我可以使用

【问题讨论】:

标签: java xml jaxb jax-rs


【解决方案1】:

您可以为日期使用不同的xsd 类型。 首次使用

<xs:element name="mySimpleDate" type="xs:date"/>

第二次使用

<xs:element name="myDatetime" type="xs:dateTime"/>

在你的 xsd 中。

【讨论】:

    【解决方案2】:

    我们尝试了 XMLAdapter,但我们无法确定它是否用于字段 日期 1 或日期 2

    XmlAdapter 是正确的方法,您只需要一个您想要实现的格式。

    @XmlAccessorType(XmlAccessType.FIELD)
    class Dates {
        @XmlJavaTypeAdapter(MyDateAdapter.class)
        Date date1; //in xml this date must be in format dd-mon-yyyy
    
        @XmlJavaTypeAdapter(MyDateTimeAdapter.class)
        Date date2; // in xml this date must be in format dd-mm-yyyy hh:ss sss
    } 
    

    如果您是从 XML 模式生成这些类,请参阅下面链接的我的答案:

    【讨论】:

    • 感谢您的示例;我知道这是答案,但我无法绑定数据类型。非常感谢您的帮助
    【解决方案3】:

    您可以创建一个扩展 java.util.Date 的新类,就像一种包装器:

    public class CustomDate extends Date {
    
        public CustomDate() {
            super();
        } 
    
    } 
    

    date2 声明为CustomDate,这样您就可以正确解析这两个日期。

    否则将date2 声明为Timestamp 对象并为这两种类型创建两个不同的适配器。

    Date 对象开始构造它:

    Date d2 = new Date();
    Timestamp t2 = new Timestamp(d2.getTime());
    

    【讨论】:

    • hmm...不高兴这些类是通过 XSD 生成的
    • @Ravi 是什么意思?能改不改?
    • @Santoshi,我无法进行此更改,因为 xsd 是从第 3 方供应商处获得的。使用这个 xsd 和 XJC 命令,我们正在生成 jaxb bean。当我们返回响应时,他们期待不同格式的日期。作为 3 个这样的约定,每次 XSD 更改时搜索整个 xsd 并更改数据类型是不可行的。我在想我是否可以使用 Marshaller 暴露的事件
    • 如果无法更改输入xsd,可以尝试bind the elements to different datatypes。可以在节点或元素级别更改类型。官方指南是here,与您相关的是第 5.6.1 节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多