2015-02-06 52 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>