繁体   English   中英

在Jax-WS Client中解析Soap日期

[英]Parsing Soap dates in Jax-WS Client

我正在使用Jax-WS访问SOAP服务,并且遇到一种数据类型的困难:

  <xs:complexType name="OurDateType">
    <xs:sequence>
      <xs:element name="Day" type="xs:gDay" minOccurs="0">
      </xs:element>
      <xs:element name="Month" type="xs:gMonth">
      </xs:element>
      <xs:element name="Year" type="xs:gYear">
      </xs:element>
    </xs:sequence>
  </xs:complexType>

客户端存根是自动生成的,它为DayMonthYear每个生成一个带有XmlGregorianCalendar字段的类型:

public class OurDateType {
  @XmlElement(name = "Day")
  @XmlSchemaType(name = "gDay")
  protected XMLGregorianCalendar day;
  @XmlElement(name = "Month", required = true)
  @XmlSchemaType(name = "gMonth")
  protected XMLGregorianCalendar month;
  @XmlElement(name = "Year", required = true)
  @XmlSchemaType(name = "gYear")
  protected XMLGregorianCalendar year;

SOAP调用无法从返回的XML解组此结构:

<TheDate xsi:type="ns1:OurDateType">
  <Month xsi:type="xsd:gMonth">10</Month>
  <Year xsi:type="xsd:gYear">2011</Year>
</TheDate>

该错误是SOAP exception: Unmarshalling Error: 10

我尝试创建一个package-info.java文件来覆盖反编组,但是存在以下问题:

  1. wsimport创建一个package-info.java文件。 由于同一软件包不能包含两个package_info.java实例,因此我必须编辑生成的代码。
  2. 之后,我的适配器类被传递给字符串以进行解组,而没有任何上下文可以告诉它是一天,一个月还是一年。

是否有可能重写代码生成并提供我自己的类来捕获此类型,或者以知道原始XML模式类型的方式重写解组? 我的版本更改能力有限,因为该代码还可以作为其他三个SOAP服务的客户端,并为其自身的客户端提供SOAP服务。

作为参考,以下是代码生成的配置:

        <plugin>
            <groupId>org.jvnet.jax-ws-commons</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <xadditionalHeaders>true</xadditionalHeaders>
                <verbose>true</verbose>
                <sourceDestDir>${project.build.directory}/generated-sources/jaxws/wsimport</sourceDestDir>
                <staleFile>${project.build.directory}/generated-sources/jaxws/wsimport/stale/.staleFlag</staleFile>
                <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
                <sei/>
            </configuration>
        </plugin>

我本人已经通过从另一个方向进行搜索来回答了这个问题。 可以使用JAXB绑定文件覆盖生成的代码。 wsimport将自动使用src/jaxws具有.xml扩展名的绑定文件。

我放弃了XmlGregorianCalendar,而是将每个日期元素解析为一个单独的整数。 这适用于我的服务,但是需要自定义解析器来处理允许的某些日期字段变体。

我使用的绑定文件是这样的:

<globalBindings>
    <javaType name="java.lang.Integer" xmlType="xs:gDay"
              parseMethod="javax.xml.bind.DatatypeConverter.parseInt"
              printMethod="javax.xml.bind.DatatypeConverter.printInt"
            />
    <javaType name="java.lang.Integer" xmlType="xs:gMonth"
              parseMethod="javax.xml.bind.DatatypeConverter.parseInt"
              printMethod="javax.xml.bind.DatatypeConverter.printInt"
            />
    <javaType name="java.lang.Integer" xmlType="xs:gYear"
              parseMethod="javax.xml.bind.DatatypeConverter.parseInt"
              printMethod="javax.xml.bind.DatatypeConverter.printInt"
            />
</globalBindings>
</bindings>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM