将Java日期对象映射为XML模式日期时间格式
我在将Java数据类型映射到标准模式日期数据类型时遇到一些问题 我有一个简单的类,我这样注释。period实例变量是Java日期对象类型将Java日期对象映射为XML模式日期时间格式,java,xml,web-services,xsd,jaxb,Java,Xml,Web Services,Xsd,Jaxb,我在将Java数据类型映射到标准模式日期数据类型时遇到一些问题 我有一个简单的类,我这样注释。period实例变量是Java日期对象类型 @XmlAccessorType(value = XmlAccessType.NONE) public class Chart { @XmlElement private double amount; @XmlElement private double amountDue; @XmlElement privat
@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>
20
20.5
**2001-01-01T00:01:00+08:00**
我希望period元素像这样返回
<period>2001-01-01</period>
2001-01-01
有什么方法可以实现这一点吗?您的
图表构造函数似乎正在将格式化的日期字符串解析回日期,然后使用默认格式将其序列化为XML响应。
我猜使用私有字符串句点代码>(以及修复构造函数)应该可以工作使用注释,您可以按任何方式封送/取消封送字段
但我不知道这是不是最简单的方法
还要注意,它可能会损害与任何试图使用WSDL的代码的互操作性。其他代码的程序员会将xsd:string视为字段类型,因此必须手动进行格式化和解析(就像您所做的一样,是的),这会引入很多bug。所以请考虑XSD:日期真的是一个糟糕的选择。
被盗自:
尽管仍不清楚为什么不为日期生成时区信息,但该代码在实践中起作用,并且需要的键入更少。您可以执行以下操作来控制架构类型:
@XmlElement
@XmlSchemaType(name="date")
private Date period;
有关更多信息:
谢谢您的帮助。我认为您的建议会起作用,但是来自DB的数据实际上是一个日期对象,这个类处理映射。如果我将其转换为字符串,则可能需要重新编译其他代码。“还有其他想法吗?”通往亚姆伯格之路的答案要好得多。upvotingFYI,JAXB的@XmlSchemaType(“日期”)可用于此用例:@road to yamburg-yyyy-MM-dd是xsd:date的格式,它在@XmlSchemaType注释中指定。很高兴知道,谢谢,但您能给我指一下说明这一点的文档吗?我查看了,它没有提到任何格式。@road to yamburg-JAXB@XmlSchemaType注释允许您指定模式类型,模式类型的格式包含在XML模式规范中。xsd:date的格式包含在这里:xsd:date类型有一个可选的时区部分。在XmsSchemaType文档中,它说在生成的XML中不会指定时区?@road to yamburg-还没有找到规范参考,但是Metro(参考实现)或MOXy在将java.util.Date实例编组为xsd:Date时都没有包含名称空间信息。
@XmlSchemaType("date")
Date someDate;
@XmlElement
@XmlSchemaType(name="date")
private Date period;