我在将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>
有什么方法可以实现这个目标吗?
答案 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;
(并修复构造函数)应该可以正常工作