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).

InformationsquelleAutor hideburn | 2016-04-16
Schreibe einen Kommentar