2011-04-25 100 views
7

我有一些问题将我的Java数据类型映射到标准架构日期数据类型。将Java日期对象映射到XML架构日期时间格式

我有一个简单的类,我这样注释。句点实例变量是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> 

有没有什么办法可以做到这一点?

回答

8

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

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

更多信息:

+0

如何在这种情况下将xml日期格式化为yyyy-MM-dd? – 2011-04-25 14:37:55

+0

@road到yamburg - yyyy-MM-dd是xsd:date的格式,它在@XmlSchemaType注释中指定。 – 2011-04-25 14:54:30

+0

很高兴知道,谢谢,但您能否指出我所说的文档?我查看了http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlSchemaType.html,它没有提及任何格式。 – 2011-04-25 15:26:04

0

您的Chart构造函数似乎将格式化的日期字符串解析回Date,然后使用默认格式序列化为XML响应。 我想用private String period;(和固定的构造函数)应该工作

+0

感谢您的帮助。我认为你的建议可行,但来自数据库的数据实际上是一个Date对象,并且此类处理映射。如果我将其转换为字符串,那么我可能不得不重新编译其他代码。请任何其他想法? – 2011-04-25 06:52:23

+0

@ road to yamburgs答案好多了。 upvoting – qwerty 2011-04-25 07:05:19

7

使用@XmlJavaTypeAdapter注释,你可以元帅/解组的田野上你想要的任何方式。

不能说,如果这是最简单的方法。

另请注意,它可能会损害与任何试图使用您的WSDL的代码的互操作性。其他代码的程序员会将xsd:string视为字段类型,因此必须手动执行格式设置和解析(就像您一样,是的),介绍谁知道有多少错误。所以请考虑一下xsd:真的是一个不错的选择。

被盗从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); 
    } 
} 

UPDATE:如被@Blaise Doughan提到的,更短的方法是用

@XmlSchemaType("date") 
Date someDate; 

标注的日期尽管它仍然是不明确为什么时区信息不是在日期生成的,这个代码在实际工作中需要少得多的输入。

+0

一个可能的解决方案。+1 – 2011-04-25 06:57:52

+0

仅供参考,JAXB的@XmlSchemaType(“date”)可以用于此用例:http://stackoverflow.com/questions/5775860/mapping-java-date-object-to-xml-schema-datetime-format/5776970#5776970 – 2011-04-25 09:25:27