如何用日期替换 XmlGregorianCalendar?

Posted

技术标签:

【中文标题】如何用日期替换 XmlGregorianCalendar?【英文标题】:how replace XmlGregorianCalendar by Date? 【发布时间】:2012-06-22 00:03:29 【问题描述】:

我必须通过 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>

【问题讨论】:

【参考方案1】:

未经测试,但应该可以工作。首先创建这样的类:

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?

【讨论】:

嘿 Tomasz 我试过你的解决方案,我实际上是使用 maven 插件生成源代码。它确实生成了所有必要的源,并且确实生成了 Date 而不是 XMLGregorianCalendar 并且还使用 @XmlJavaTypeAdapter(Adapter2 .class) @XmlSchemaType(name = "date") protected Date closedDate; 进行了注释。但我的问题是它在适配器类中找不到 XsdDateTimeConverter 并且出现编译错误。你能帮我解决这个问题吗? 通过在类名前指定完整的包名解决了。【参考方案2】:

感谢托马斯。上述解决方案有效。 但是 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>

【讨论】:

以上是关于如何用日期替换 XmlGregorianCalendar?的主要内容,如果未能解决你的问题,请参考以下文章

如何用批处理找出文件名有特定前缀的文件并删除文件名的前缀及后面的日期

如何用ajax响应替换html元素?

如何用加号“+”号替换空格

如何用 setKeepAliveTimeout 方法替换 UIRemoteNotificationTypeVoip 方法?

如何用 HttpClient 替换 WebClient?

如何用一个字符替换两个字符?