如何用Date替换XmlGregorianCalendar?

时间:2012-06-19 21:19:53

标签: web-services jax-ws

我必须通过jax-ws公开ejb服务层。

我使用jax-ws和wsimport生成了Web服务但是我被一些奇怪的东西拦住了;日期被映射到XmlGregorianCalendar。 是否可以使用经典的Java Date? 你能告诉我正确的方法吗?

谢谢。 编辑: 这是我使用的绑定文件: 谢谢,我稍微修改了你的xml并将它与netbeans一起附加到客户端的webservice并且它有效。这是我使用的绑定:

<jaxws:bindings  node="wsdl:definitions/wsdl:types/xsd:schema"
                 xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"

                                xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"

                                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

                                xmlns:xsd="http://www.w3.org/2001/XMLSchema" wsdlLocation="../wsdl/localhost_8080/web_test/Testor.wsdl" >


 <jaxb:globalBindings>
          <jaxb:javaType   name="java.util.Date"
        xmlType="xsd:dateTime"
        parseMethod="lol.XsdDateTimeConverter.unmarshal"
        printMethod="lol.XsdDateTimeConverter.marshalDateTime"        
          /><jaxb:javaType 
        name="java.util.Date"
        xmlType="xsd:date"
        parseMethod="lol.XsdDateTimeConverter.unmarshal"
        printMethod="lol.XsdDateTimeConverter.marshalDate"
        />
      </jaxb:globalBindings>


</jaxws:bindings>

2 个答案:

答案 0 :(得分:19)

未经测试,但应该有效。首先创建这样的类:

import javax.xml.bind.DatatypeConverter;

public class XsdDateTimeConverter {

    public static Date unmarshal(String dateTime) {
        return DatatypeConverter.parseDate(dateTime).getTime();
    }

    public static String marshalDate(Date date) {
        final GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        return DatatypeConverter.printDate(calendar);
    }

    public static String marshalDateTime(Date dateTime) {
        final GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(dateTime);
        return DatatypeConverter.printDateTime(calendar);
    }

}

然后将其添加到自定义xjb文件中:

<javaType
        name="java.util.Date"
        xmlType="xs:dateTime"
        parseMethod="XsdDateTimeConverter.unmarshal"
        printMethod="XsdDateTimeConverter.marshalDateTime"
        />
<javaType
        name="java.util.Date"
        xmlType="xs:date"
        parseMethod="XsdDateTimeConverter.unmarshal"
        printMethod="XsdDateTimeConverter.marshalDate"
        />
</globalBindings>

未经测试,但应该有效。根据我在这里的回答:JAX-WS and Joda-Time?

答案 1 :(得分:1)

感谢Tomasz。以上解决方案有效。
但是wsimport还将其适配器集(如Adapter1.java和Adapter2.java)与其包 org.w3._2001.xmlschema 相加,这实际上与我自己的包结构不匹配。

我找到了一种方法来使用另一个jaxb绑定来更改此包名称。实际上,我搜索了很多,但很难找到这个,所以我在这里添加它给任何寻找相同的人。

使用&#39; -b binding.xml&#39;在wsimport中添加以下绑定。请注意,wsimport可以使用多个绑定文件。

binding.xml 以下内容:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.w3.org/2001/XMLSchema"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  jaxb:version="2.0">
  <annotation><appinfo>
    <jaxb:schemaBindings>
      <jaxb:package name="com.abc.xyz.utils"/>
    </jaxb:schemaBindings>
  </appinfo></annotation>
</schema>