【问题标题】:Mapping Java Date Object to XML Schema datetime format将 Java 日期对象映射到 XML 模式日期时间格式
【发布时间】:2011-08-12 03:54:54
【问题描述】:

我在将 Java 数据类型映射到标准架构日期数据类型时遇到了一些问题。

我有一个简单的类,我这样注释。 period 实例变量是 Java Date 对象类型。

@XmlAccessorType(value = XmlAccessType.NONE)
public class Chart {
    @XmlElement
    private double amount;
    @XmlElement
    private double amountDue;
    @XmlElement
    private Date period;
    //constructor getters and setters
}

这是我的网络服务

@WebService
public class ChartFacade {
    @WebMethod
    public Chart getChart() throws ParseException {
      SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
      Chart chart = new Chart(20.0,20.5, df.parse("2001-01-01"));
      return chart;
    }
}

我的问题是它返回的日期数据格式不符合我的预期。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getChartResponse xmlns:ns2="http://ss.ugbu.oracle.com/">
         <return>
            <amount>20.0</amount>
            <amountDue>20.5</amountDue>
            **<period>2001-01-01T00:01:00+08:00</period>**
         </return>
      </ns2:getChartResponse>
   </S:Body>
</S:Envelope>

我希望像这样返回句点元素

<period>2001-01-01</period>

有什么方法可以实现吗?

【问题讨论】:

    标签: java xml web-services xsd jaxb


    【解决方案1】:

    使用@XmlJavaTypeAdapter 注释,您可以按照您想要的方式编组/解组您的字段。

    不知道这是否是最简单的方法。

    还要注意,它可能会损害与任何尝试使用您的 WSDL 的代码的互操作性。其他代码的程序员会将 xsd:string 视为字段类型,因此必须手动进行格式化和解析(就像你做的那样,是的),谁知道有多少错误。所以请考虑一下 xsd:date 是否真的是一个糟糕的选择。

    盗自here:

    @XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
    Date someDate;
    ...
    
    public class DateAdapter extends XmlAdapter<String, Date> {
    
        // the desired format
        private String pattern = "MM/dd/yyyy";
    
        public String marshal(Date date) throws Exception {
            return new SimpleDateFormat(pattern).format(date);
        }
    
        public Date unmarshal(String dateString) throws Exception {
            return new SimpleDateFormat(pattern).parse(dateString);
        }   
    }
    

    更新:正如@Blaise Doughan 提到的,更短的方法是用

    注释日期
    @XmlSchemaType("date")
    Date someDate;
    

    尽管仍然不清楚为什么没有为日期生成时区信息,但此代码在实践中有效并且需要的输入更少。

    【讨论】:

    【解决方案2】:

    您可以执行以下操作来控制架构类型:

    @XmlElement
    @XmlSchemaType(name="date")
    private Date period;
    

    更多信息:

    【讨论】:

    • @road to yamburg - yyyy-MM-dd 是 xsd:date 的格式,在@XmlSchemaType 注解中指定。
    • 很高兴知道,谢谢,但你能指点我说的文档吗?我查看了download.oracle.com/javaee/5/api/javax/xml/bind/annotation/…,它没有提到任何格式。
    • @road to yamburg - JAXB @XmlSchemaType 注解允许您指定模式类型,模式类型的格式包含在 XML 模式规范中。这里介绍了 xsd:date 的格式:w3.org/TR/xmlschema-2/#date
    • xsd:date 日期类型有一个可选的时区部分。 XmsSchemaType 文档中的哪个位置说生成的 XML 中不会拼写出时区?
    • @road to yamburg - 尚未找到规范参考,但 Metro(参考实现)或 MOXy 在将 java.util.Date 的实例编组为 xsd:date 时均不包含命名空间信息。
    【解决方案3】:

    您的Chart 构造函数似乎将格式化的日期字符串解析回Date,然后使用XML 响应的默认格式对其进行序列化。 我想使用private String period;(并修复构造函数)应该可以工作

    【讨论】:

    • 感谢您的帮助。我认为您的建议可行,但来自 DB 的数据实际上是一个 Date 对象,并且此类处理映射。如果我将其转换为字符串,那么我可能不得不重新编译其他代码。请问还有什么好办法吗?
    • @road to yamburgs 的答案要好得多。点赞
    猜你喜欢
    • 2019-08-30
    • 2016-05-10
    • 2012-07-23
    • 2012-09-09
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多