2010-03-08 5 views
1

CXF 웹 서비스에서 JAXB를 사용하고 있습니다. 내가 전달하는 경우 :왜 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입니다. 하지만 전달하는 경우 :

CXF 검사기 및 wikipedia에 따라, 유효
<?xml version="1.0" ?><ns2:Optionen xmlns:ns2="http://test.at/ezustellung/global/20090501#"> 
<PdfAKonvertierung>true</PdfAKonvertierung><SignaturTyp>Adobe</SignaturTyp> 
</ns2:Optionen> 

(번역, 즉 영어로 발견하지 않았습니다) : 요소의

자식 요소를 네임 스페이스 접두사로하지 않습니다 자동으로 동일한 네임 스페이스를 갖기 때문에 네임 스페이스가 접두사로 있어야합니다.

속성이 그에 따라 설정됩니다. 누군가 내 코드에서 오류를 발견 할 수 있습니까? 아니면 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", DEFAULTVALUE = "true"를) \t 보호 부울 pdfAKonvertierung; \t @XmlElement (namespace = "http://test.at/ezustellung/global/20090501#", name = "SignaturTyp", defaultValue = "Adobe") \t protected SignatureTypeType signTypeTyp; – Florian

+2

그러면 왜 대답을 수락하거나 upvote하지 않습니까? – jarnbjo

+0

죄송합니다. 여기 새로 왔습니다. 답변을 수락했지만 크레딧이 필요하므로 투표를 할 수 없었습니다. – Florian

4

문제로 (생성 된 클래스를 변경하지 않고) 용액을

<xs:schema elementFormDefault="qualified"> 

속성이 존재하는지 확인하고 JAXB 매핑을 재생시키기 때문에

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

단부이었다 위로 -up.java

관련 문제