2010-03-08 62 views
1

我正在使用JAXB和CXF Web服務。當我通過:爲什麼JAXB不能正確處理名稱空間子元素?

<?xml version="1.0" ?><ns2:Optionen xmlns:ns2="http://test.at/ezustellung/global/20090501#"> 
<ns2:PdfAKonvertierung>true</ns2:PdfAKonvertierung><ns2:SignaturTyp>Adobe</ns2:SignaturTyp> 
</ns2:Optionen> 

給Unmarshaller,屬性pdfAKonvertierung和signaturTyp在我的對象中都是null。但是,如果我通過:

<?xml version="1.0" ?><ns2:Optionen xmlns:ns2="http://test.at/ezustellung/global/20090501#"> 
<PdfAKonvertierung>true</PdfAKonvertierung><SignaturTyp>Adobe</SignaturTyp> 
</ns2:Optionen> 

這是無效的,根據CXF驗證和wikipedia(翻譯,都沒有發現,在英語):

元素的子元素有一個命名空間前綴不自動具有相同的名稱空間,它們也必須以名稱空間作爲前綴。

屬性相應地設置。有人能夠在我的代碼中發現錯誤,或者我是否從Java 1.6中發現了JAXB實現中的錯誤?

僅供參考,這裏是我的代碼:

public class JaxbTests { 
    @Test 
    public void testOptionen() throws JAXBException, SAXException, IOException { 
    JAXBContext context = JAXBContext.newInstance(Optionen.class); 
    Unmarshaller unmarshaller = context.createUnmarshaller(); 
    ByteArrayInputStream is = new ByteArrayInputStream(
    // Does not work 
    ("<?xml version=\"1.0\" ?><ns2:Optionen xmlns:ns2=\"http://test.at/ezustellung/global/20090501#\">" + 
    "<ns2:PdfAKonvertierung>true</ns2:PdfAKonvertierung><ns2:SignaturTyp>Adobe</ns2:SignaturTyp>" + 
    "</ns2:Optionen>").getBytes()); 

    // Works 
// ("<?xml version=\"1.0\" ?><ns2:Optionen xmlns:ns2=\"http://test.at/ezustellung/global/20090501#\">" + 
// "<PdfAKonvertierung>true</PdfAKonvertierung><SignaturTyp>Adobe</SignaturTyp>" + 
// "</ns2:Optionen>").getBytes()); 
    Optionen opts = ((Optionen) unmarshaller.unmarshal(is)); 
    Assert.assertTrue(opts.isPdfAKonvertierung() == true); 
    Assert.assertEquals(SignaturTypType.ADOBE, opts.getSignaturTyp()); 
    } 
} 


@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "pdfAKonvertierung", 
    "signaturTyp" 
}) 
@XmlRootElement(name = "Optionen") 
public class Optionen { 

    @XmlElement(name = "PdfAKonvertierung", defaultValue = "true") 
    protected Boolean pdfAKonvertierung; 
    @XmlElement(name = "SignaturTyp", defaultValue = "Adobe") 
    protected SignaturTypType signaturTyp; 

    public Optionen() { 
     System.out.println("Optionen created"); 
    } 
    public Boolean isPdfAKonvertierung() { 
     return pdfAKonvertierung; 
    } 
    public void setPdfAKonvertierung(Boolean value) { 
     this.pdfAKonvertierung = value; 
    } 
    public SignaturTypType getSignaturTyp() { 
     return signaturTyp; 
    } 
    public void setSignaturTyp(SignaturTypType value) { 
     this.signaturTyp = value; 
    } 

} 


@XmlType(name = "SignaturTypType") 
@XmlEnum 
public enum SignaturTypType { 

    @XmlEnumValue("Adobe") 
    ADOBE("Adobe"), @XmlEnumValue("PDF-AS") 
    PDF_AS("PDF-AS"); 
    private final String value; 

    SignaturTypType(String v) { 
    this.value = v; 
    } 

    public String value() { 
    return this.value; 
    } 

    public static SignaturTypType fromValue(String v) { 
    for (SignaturTypType c : SignaturTypType.values()) { 
    if (c.value.equals(v)) { 
    return c; 
    } 
    } 
    throw new IllegalArgumentException(v); 
    } 

} 

package-info.java:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://test.at/ezustellung/global/20090501#") 
package at.test.ezustellung.global._20090501_; 

回答

2

這是一個有點難以閱讀的格式不正確的代碼,但不會將其固定你的問題,如果你聲明你的元素與正確的命名空間,例如@XmlElement(namespace = "http://test.at/ezustellung/global/20090501#", name = "SignaturTyp", defaultValue = "Adobe")

+0

這解決了這個問題。非常感謝!在Optionen類中更改以下行,導致單元測試正確傳遞: \t @XmlRootElement(namespace =「http://test.at/ezustellung/global/20090501#」,name =「Optionen」) \t public類Optionen { \t \t @XmlElement(命名空間= 「http://test.at/ezustellung/global/20090501#」,名字= 「pdfAKonvertierung」,默認值= 「真」) \t保護布爾pdfAKonvertierung; \t @XmlElement(namespace =「http://test.at/ezustellung/global/20090501#」,name =「SignaturTyp」,defaultValue =「Adobe」) \t protected SignaturTypType signaturTyp; – Florian 2010-03-09 08:32:10

+2

那麼你爲什麼不接受答案或upvote呢? – jarnbjo 2010-03-09 08:49:47

+0

對不起,我是新來的,我已經接受你的回答,但無法投票,因爲需要學分。 – Florian 2010-03-09 14:39:15

4

將該溶液(在不修改所生成的類)的問題是要確保該

<xs:schema elementFormDefault="qualified"> 

屬性存在並再生JAXB映射,因此 該

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED 

端在包--info.java

相關問題