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_;
문제가 해결되었습니다. 고마워요! 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
그러면 왜 대답을 수락하거나 upvote하지 않습니까? – jarnbjo
죄송합니다. 여기 새로 왔습니다. 답변을 수락했지만 크레딧이 필요하므로 투표를 할 수 없었습니다. – Florian