将Java Date对象映射到XML Schema日期时间格式

时间:2011-04-25 06:30:30

标签: java xml web-services xsd jaxb

我在将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
}

这是我的Web服务

@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>

有什么方法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:8)

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

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

更多信息:

答案 1 :(得分:7)

使用@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 :(得分:0)

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