Java 为什么';JAXB是否正确处理命名空间的子元素?
我将JAXB与CXF Web服务一起使用。当我经过时:Java 为什么';JAXB是否正确处理命名空间的子元素?,java,xml,jaxb,cxf,Java,Xml,Jaxb,Cxf,我将JAXB与CXF Web服务一起使用。当我经过时: <?xml version="1.0" ?><ns2:Optionen xmlns:ns2="http://test.at/ezustellung/global/20090501#"> <ns2:PdfAKonvertierung>true</ns2:PdfAKonvertierung><ns2:SignaturTyp>Adobe</ns2:SignaturTyp> &
<?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>
读取格式不正确的代码有点困难,但是如果使用正确的名称空间(例如
@xmlement(namespace=)声明元素,它不会解决问题吗http://test.at/ezustellung/global/20090501#,name=“signaturetyp”,defaultValue=“Adobe”)
?解决方案(不修改生成的类)解决问题的方法是确保
<xs:schema elementFormDefault="qualified">
最终在解决问题的包info.java中结束。非常感谢!更改Optionen类中的以下行,导致单元测试正确通过:@XmlRootElement(namespace=“”,name=“Optionen”)公共类Optionen{@xmlement(namespace=“”,name=“PdfAKonvertierung”,defaultValue=“true”)受保护的布尔值pdfakonverterung;@xmlement(namespace=”“,name=“signaturetyp”,defaultValue=“Adobe”)protected SignatureType SignatureTyp;抱歉,我是新来的,我接受了你的答案,但无法投票,因为需要积分。我无法让xjc为XmlElement/XmlRootElement批注生成命名空间属性。有什么办法吗?
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);
}
}
@javax.xml.bind.annotation.XmlSchema(namespace = "http://test.at/ezustellung/global/20090501#")
package at.test.ezustellung.global._20090501_;
<xs:schema elementFormDefault="qualified">
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED