Möglichkeit zum hinzufügen von xml-root-element annotation für die generierte Klasse?
Habe ich generierten JAXB-Klassen aus WSDL-Datei, und was ich versuche zu tun, ist die Umwandlung von XML zu Java-Objekt. Hier generierten JAXB-Klasse Beispiel:
XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetProductListResponse", propOrder = {
"productList",
"productListDate",
"failed",
"failedDescription"
})
public class GetProductListResponse {
@XmlElementRef(name = "ProductList", namespace = "http://productService.productsdata", type = JAXBElement.class, required = false)
protected JAXBElement<ArrayOfProductListDetail> productList;
@XmlElementRef(name = "ProductListDate", namespace = "http://productService.productsdata", type = JAXBElement.class, required = false)
protected JAXBElement<String> productListDate;
@XmlElement(name = "Failed")
protected boolean failed;
@XmlElement(name = "FailedDescription", required = true, nillable = true)
protected String failedDescription;
...
}
Beispiel der XML, die ich brauche, um zu konvertieren, um GetProductListResponse
Objekt gespeichert ist im inneren der products.xml
- Datei, und es sieht wie folgt aus:
<GetProductListResult xmlns="http://productService.productsdata">
<ProductList>
<ProductListDetail>
<ProductName>SomeProductName</ProductName>
<ProductCost>9,45</ProductCost>
</ProductListDetail>
<ProductListDate>09.09.2015</ProductListDate>
<Failed>false</Failed>
<FailedDescription/>
</ProductList>
</GetProductListResult>
Innerhalb der convertXmlProductsTest
Methode ist, wo die Umwandlung Anruf set - mit jaxb unmarshaller
für diesen Zweck:
public class ProductHandler {
public static GetProductListResponse convertXmlProductsTest(){
try {
JAXBContext jaxbContext = JAXBContext.newInstance(GetProductListResponse.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
GetProductListResponse retval = (GetProductListResponse) jaxbUnmarshaller.unmarshal(new File("products.xml"));
return retval;
} catch (JAXBException ex) {
Logger.getLogger(ProductMockWs.class.getName()).log(Level.SEVERE, null, ex);
}
throw new UnsupportedOperationException("XML to Java object conversion failed.");
}
}
Das problem ist, dass die generierten JAXB-Klasse GetProductListResponse
nicht enthalten @XmlRootElement
annotation, so dass diese Konvertierung schlägt fehl mit der berühmten Fehlermeldung javax.xml.bind.UnmarshalException: unexpected element ... Expected elements are ...
.
Wenn ich manuell hinzufügen @XmlRootElement
Kommentar zu den GetProductListResponse
- Klasse, und legen Sie es als:
@XmlRootElement(name="GetProductsListResult")
public class GetProductListResponse { ...}
Konvertierung erfolgreich war.
FRAGE:
Gibt es eine Möglichkeit, um @XmlRootElement
für die generierte Klasse (GetProductListResponse
) von außerhalb dieser Klasse?
Möchte ich vermeiden Anpassung der generierten Klasse und ich will nicht zu ändern, WSDL-definition. Auch Las ich über die Einstellung der Laufzeit Anmerkungen, aber ich möchte vermeiden, die Notwendigkeit der Verwendung von Java-bytecode-Manipulatoren (wie Javassist).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fehlende @XmlRootElement dieser Artikel hat mir sehr geholfen. Werfen Sie einen Blick :
http://www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html
Finden Sie Ihre Fehler hier und sehen, was Sie tun können! Hoffe, es hilft !
Dies ist möglich, in Jackson json/xml-parser-Bibliothek. Jackson voll unterstützt JAXB-Annotationen und seine mixin-Funktion ermöglicht das hinzufügen von Anmerkungen zu einer Klasse extern von der Quelle.