2011-03-17 58 views
13

我已經這樣JAXB綁定文件:

<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <jxb:bindings schemaLocation="example.xsd" node="/xs:schema"> 
    <jxb:schemaBindings> 
     <jxb:package name="example" /> 
    </jxb:schemaBindings> 
    <jxb:globalBindings> 
     <jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" 
      parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" 
      printMethod="javax.xml.bind.DatatypeConverter.printDateTime" /> 
     <jxb:javaType name="java.util.Calendar" xmlType="xs:date" 
      parseMethod="javax.xml.bind.DatatypeConverter.parseDate" 
      printMethod="javax.xml.bind.DatatypeConverter.printDate" /> 
     <jxb:javaType name="java.util.Calendar" xmlType="xs:time" 
      parseMethod="javax.xml.bind.DatatypeConverter.parseTime" 
      printMethod="javax.xml.bind.DatatypeConverter.printTime" /> 
    </jxb:globalBindings> 

    </jxb:bindings> 
</jxb:bindings> 

架構類的結合文件在「實例」中產生XmlAdapters和包名(正確的),但在「org.w3._2001.xmlschema的XmlAdapters 「(錯誤)。我怎樣才能解決這個問題?

+0

你有沒有想過如何解決這個問題? – Matt 2011-11-07 18:23:50

回答

7

我也有這個問題,使用this解決它。

+0

我還沒有嘗試過,但由於提示是在(非)官方JAXB指南,我想這是要走的路。 Thnaks。 – Puce 2011-09-06 23:15:32

+0

現在鏈接導致找不到錨點的github。最好的例子說明爲什麼只有鏈接的答案是不值得的。 – Scorpio 2018-02-22 10:32:50

10

org.w3._2001.xmlschema軟件包在這裏創建,因爲XJC必須生成一個擴展javax.xml.bind.annotation.adapters.XmlAdapter的類,該類繼而調用您的解析/打印靜態方法。出於某種原因,它將它們放入這個包中,而不是更有用的地方。

你還沒說你使用的JAXB實現,但JAXB RI有一個擴展javaType綁定定製,它允許你直接指定的XmlAdapter一個子類,而不是parseMethod /printMethod雙。這消除了生成合成XmlAdapter橋類的需求。請參閱RI docs瞭解如何執行此操作。我覺得EclipseLink/Moxy有類似的東西,但我不確定Java6附帶的XJC是否可以做到這一點(當Sun帶來它時,似乎已經從RI中刪除了一半有用的東西進入JRE)。

+0

我使用Java SE 6 U24及以下Maven插件: \t \t \t \t \t org.jvnet.jaxb2.maven2 Maven的JAXB2-插件 0.7.5 所以我認爲這是JAXB 2.1 – Puce 2011-03-17 14:06:52

+0

我很好用生成的適配器(因爲它們只用於internatlly),但我希望它們在與其他生成的類相同的包中。 – Puce 2011-03-17 14:13:42

+0

如果我會使用自定義手寫適配器。 JAXB 2.1能做到這一點嗎?也許通過以某種方式定義Maven插件的擴展(支持自定義擴展,我之前使用過)。另外我想在外部綁定文件而不是XSD中定義自定義(您提供的鏈接顯示如何直接在XSD中執行此操作)。如何使用XJB文件和Maven執行此操作? – Puce 2011-03-17 14:18:42

7

對於Apache CXF用戶,最簡潔的方法是使用wsdl2java提供的-p選項。

-p [WSDL的命名空間=] PACKAGENAME

指定爲零,或更多個,包名要用於生成的代碼。 (可選)指定要打包名稱映射的WSDL名稱空間。

在我們的例子

-p http://www.w3.org/2001/XMLSchema=org.acme.foo

如果使用CXF-CODEGEN-插件,然後只需添加另一對<extraarg>

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.version}</version> 
     [...] 
    <extraarg>-p</extraarg> 
    <extraarg>http://www.w3.org/2001/XMLSchema=org.acme.foo</extraarg> 
     [...] 
</plugin> 

不需要targetNamespace指向保留的XSD名稱空間,也不需要捕獲全部jaxb包綁定。

+2

救了我的命:) – 2014-09-02 14:50:16

+0

救了我的命也。 – mithrop 2015-04-14 14:46:46

+0

注意如果您有多個WSDL的,並指定相同的封裝所有的人,那麼你仍然可以運行到由於匿名的命名問題(「適配器org.w3._2001.xmlschema.Adapter4並不適用於野外類型的Java。 lang.Integer」,這是什麼導致我在這裏)。但是,如果指定了_different_包,則可以解決問題,但在不同的包中可能有不同名稱的相同適配器的多個副本,這並不令人感到非常優雅。我在下面使用了John Zhang的解決方案(但是複製了以前自動生成的適配器作爲起點)。 – DarthPablo 2017-06-29 10:35:55

4

使用GlobalBinding的更好方法是指定顯式適配器,而不是使用此分析/打印對。例如,而不是下面:

<jaxb:javaType name="java.lang.Long" xmlType="xs:long" 
         parseMethod="com.mypackage.myclass.parseLong" 
        printMethod="com.mypackage.myclass.print"/> 

相反,你應該:

<xjc:javaType name="java.lang.Long" xmlType="xs:long" 
        adapter="com.mypackage.LongAdapter"/> 

記住添加命名空間XJC:

xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
      jxb:extensionBindingPrefixes="xjc" 

類LongAdapter會是這樣:

public class LongAdapter 
extends XmlAdapter<String, Long> 
{ 


public Long unmarshal(String value) { 
    return your_util_class.parseLong(value); 
} 

public String marshal(Long value) { 
    return your_util_class.print(value); 
} 

} 

通過這種方式,由於您明確指定了適配器類,因此jaxb不會生成缺省包名稱爲org.w3._2001.xmlschema的缺省適配器。

避免使用默認包名稱org.w3._2001.xmlschema是非常重要的。舉一個例子,如果你有一個項目A和一個項目B,並且他們都有一些模式和綁定。以舊的方式,它們都生成具有完全相同的完全限定名稱的適配器,例如, org.w3._2001.xmlschema.Adapter1。然而,這個適配器可能適用於項目A中的Long和項目B中的Integer。然後,假設您有一個使用A和B的下游項目C.現在問題變得討厭了。如果C需要使用Adapter1,則無法預測使用的是從A長整型還是從B整型。然後,您的應用程序C可能在工作一段時間很好,但在陌生的路上,也許無法在一些其他情況。如果發生這種情況,該類型的異常會是這樣:

org.w3._2001.xmlschema.Adapter1 is not applicable to the field type java.lang.Double... 

由羅伊真愛提到的解決方案似乎不工作時,我即使理論是正確的maven-JAXB2-插件試圖在我的環境。