将Java日期对象映射为XML模式日期时间格式

将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

我在将Java数据类型映射到标准模式日期数据类型时遇到一些问题

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

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