2017-07-12 27 views
0

我使用maven-jaxb2插件從多個wsdl端點成功生成java類。如何更新生成的存根的XML-TYPE

這是一個執行:

   <execution> 
        <id>generateDelta</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <schemaLanguage>WSDL</schemaLanguage> 
         <generatePackage>com.somepackage1</generatePackage> 
         <schemas> 
          <schema> 
           <url> 
            wsdl_url 
           </url> 
          </schema> 
         </schemas> 
        </configuration> 
       </execution> 

這裏的問題是,我有多次執行,從而產生多級的,每次執行保存類在不同的包。

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Bapiret2", propOrder = {...}) 

一個Babiret2.java在一個以上的包(因此,它來自多個wdsls)

生成的類的當我執行使用此短截線,在單元測試例如代碼我出現以下情況例外:

org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
Two classes have the same XML type name "{urn:sap-com:document:sap:soap:functions:mc-style}Bapiret2". Use @XmlType.name and @XmlType.namespace to assign different names to them. 
    this problem is related to the following location: 
     at com.somepackage1.Bapiret2 
    this problem is related to the following location: 
     at com.somepackage2.Bapiret2 

我發現了一些可能的解決方法就像下ARGS標籤添加在配置

-XautoNameResolution 

arg,它沒有工作

我測試瞭如果更改XmlType名稱屬性的工作原理和它的確如此。同時向XmlType添加命名空間的作品。

的問題是,我不知道如何與Maven生成的類

+0

我測試瞭如果更改XmlType名稱屬性的作品,它的確如此。 也將名稱空間添加到XmlType的作品。 問題是,我不知道如何在生成類的時候用maven添加這個 – aurelius

回答

0

對於每個WSDL URL時添加這個,配置元素裏面,你應該同時指定schemaDirectory和generatePackage元素,應該指出的名字不同於其他的,因爲schemaDirectory具有清除指定目錄的副作用。

+0

我得到了相同的結果 – aurelius

+0

@aurelius如果我說我不相信,會是冒犯的!爲了以防萬一,請在pom.xml中發佈所有元素。 – ugo

0

當兩個來自不同包但具有相同名稱空間的類都知道時,您的問題屬於JAXBContext。 因此,您需要考慮多件事情:

  1. 是否在您手中創建了JAXBContext?如果是這樣 - 你是否真的需要在同一個JAXBContext中使用這兩個類?也許你可以爲每個用例使用兩個不同的上下文?我的意思是當從somepackage1somepackage2使用Bapiret2

如果是不可能的:

  • 由相同的XSD架構 生成這兩個類Bapiret2和實際結構是一樣的?

    如果是 - 您可能需要重新考慮您生成的軟件包結構。

    您只能爲您的所有wsdl生成一個Bapiret2類。有 多種方式做到這一點通常通過添加額外的參數映射到底層的XJC編譯器像

    -p {namespace}={package Name} 
    
  • 只是檢查插件文件該怎麼做...... (注:有副作用:在包中,只有上次插件纔會執行類。

  • 如果Bapiret2在不同XSD XML元素具有相同的命名空間,但不同的結構(...當web服務開發者違抗命名空間的主要目的不幸很常見的情況下,...) 然後它是最糟糕的情況。
  • 在這種情況下,我使用上面第一個解決方案 - 不同JAXBContexts

    但無論如何,有下面的一些解決方案。 (我從來沒有嘗試過,但似乎人們都樂意這麼做:-)

    getting-the-jaxb-exception-like-two-classes-have-the-same-xml-type-name

    extending-jaxb-representing-annotations.html

    PS。手動(或通過一些腳本)更改後,仍然可以選擇...

    +0

    [錯誤]無法執行目標org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.13.1:項目生成(generateVehicle)maven.module:解析命令行時出錯[[-p {namespace} = {車輛},-episode,C:\ ... \ target \ generated-sources \ xjc \ META-INF \ sun-jaxb.episode]]:無法識別的參數-p {namespace} = {vehicle} - > [Help 1] – aurelius

    +0

    -p {namespace} = {vehicle} 在配置標籤 – aurelius

    +0

    不像它是xjc命令行的參數。 {}表示放置實際值:即'-p http:// foo.com/schema/myservice = com.foo.schema.myservice'不同的Maven插件使用不同的配置來設置它,我不確定maven- jaxb2-plugin,因爲我很久沒有用它來達到這個目的。 ...好像是''設置... – Vadim