22

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

我已经使用 jax-ws 和 wsimport 生成了 Web 服务,但我被一个奇怪的事情阻止了;日期被映射到 XmlGregorianCalendar 。是否可以使用经典的 java Date 代替?你能告诉我正确的方法吗?

谢谢 。编辑:这是我使用的绑定文件:谢谢,我稍微修改了您的 xml 并将其与 netbeans 附加到客户端的 web 服务,它工作。这是我使用的绑定:

<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>
4

2 回答 2

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 和 Joda-Time?

于 2012-06-19T21:36:24.047 回答
1

谢谢托马斯。上述解决方案有效。
但是 wsimport 还添加了它的一组适配器,如 Adapter1.java 和 Adapter2.java 及其包org.w3._2001.xmlschema,这确实与我自己的包结构不匹配。

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

使用“-b binding.xml”在 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>
于 2016-08-27T11:24:30.830 回答