2015-02-06 54 views
0

我使用JAX-WS访问SOAP服务,我有一个数据类型的困难:解析肥皂日期在JAX-WS客户

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

客户存根是自动生成的,其产生的类型与每个的DayMonth一个XmlGregorianCalendar字段,和Year

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> 

回答

0

我已经回答了我自己,从不同的方向进行搜索。可以用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>