【问题标题】:how replace XmlGregorianCalendar by Date?如何用日期替换 XmlGregorianCalendar?
【发布时间】: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>

【问题讨论】:

    标签: web-services jax-ws


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2014-01-25
      • 2019-08-20
      • 2018-12-14
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多