À l'aide de @XmlPath avec jaxb/MOXy à la carte de type complexe

J'ai un profond structure XML avec beaucoup d'inutile wrappers je suis cartographie à une seule classe Java. La cartographie de la simple types de données avec @XmlPath est une promenade dans le parc, mais quand il s'agit de types qui ont réellement besoin de leur propre classe, je ne suis pas tout à fait sûr de savoir comment faire, en particulier lorsque ces types de doit être mis dans une liste.

Je vais avoir des problèmes à la carte toutes les element types dans l'exemple ci-dessous de mon Element classe. Depuis le elements wrapper réside dans les ressources qui sont cartographiés à l'aide @XmlPath je ne peux pas utiliser le @XmlElementWrapper, qui seraient autrement la façon dont j'ai l'habitude de le faire.

Exemple de la structure XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<s:root xsi:schemaLocation="http://www.example.eu/test ResourceSchema.xsd" xmlns:s="http://www.example.eu/test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <s:resource>
        <s:information>
            <s:date>2013-07-04</s:date>
            <s:name>This example does not work</s:name>
        </s:information>
        <s:elements>
            <s:refobj>
                <s:id>1</s:id>
                <s:source>First Source</s:source>
            </s:refobj>
            <s:refobj>
                <s:id>2</s:id>
                <s:source>Second Source</s:source>
            </s:refobj>
            <s:refobj>
                <s:id>5</s:id>
                <s:source>Fifth Source</s:source>
            </s:refobj>
        </s:elements>
    </s:resource>
</s:root>

Root.java

@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlPath("resource/information/date/text()")
    private String date;

    @XmlPath("s:resource/s:information/s:name/text()")
    private String name;

    @XmlPath("resource/elements/refobj")
    private List<RefObj> refObjs;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

RefObj.java

@XmlRootElement(name = "refobj")
@XmlAccessorType(XmlAccessType.FIELD)
public class RefObj {

    @XmlElement(name = "id")
    private int id;

    @XmlElement(name = "source")
    private String source;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

}

Marshaller/Unmarshaller

public static void main(String[] args) {
    String xml = getXML();

    Root root = null;
    try {
        JAXBContext context = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = context.createUnmarshaller();

        StringReader stringReader = new StringReader(xml);

        root = (Root) unmarshaller.unmarshal(stringReader);
    } catch (Exception ex) {
        System.err.println("Failed to unmarshal XML!");
    }

    try {
        JAXBContext context = JAXBContext.newInstance(Root.class);
        Marshaller marshaller = context.createMarshaller();

        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.example.eu/test ResourceSchema.xsd");

        StringWriter stringWriter = new StringWriter();
        marshaller.marshal(root, stringWriter);

        System.out.println(new String(stringWriter.toString().getBytes(Charset.forName("UTF-8"))));
    } catch (Exception ex) {
        System.err.println("Failed to marshal object!");
    }

}

package-info.java

@XmlSchema(
        namespace = "http://www.example.eu/test",
        attributeFormDefault = XmlNsForm.QUALIFIED,
        elementFormDefault = XmlNsForm.QUALIFIED,
        xmlns = {
    @XmlNs(
            prefix = "s",
            namespaceURI = "http://www.example.eu/test")
},
        location = "http://www.example.eu/test ResourceSchema.xsd")
package se.example.mavenproject1;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Je peut exécuter l'application, mais aucun élément n'est mappé quand je unmarshal/maréchal du contenu XML, au lieu-je obtenir une représentation XML contenant les informations.

Mise à jour

Après l'affichage de l'exemple précédent, j'ai réalisé qu'en fait, il a fonctionné comme prévu, ce qui m'a fait encore plus confus. Bien que j'ai essayé de reproduire le (déjà) qui travaillent par exemple dans mon code de production, sans succès, bien que j'ai réussi à en fait introduire les problèmes que je vais avoir dans l'exemple de code. Depuis que j'ai besoin d'ajouter un espace de noms pour les problèmes apparaissent, je suis en supposant qu'il a quelque chose à voir avec les conventions de nommage et X(ml)Chemin d'accès.

J'ai aussi ajouté package-info.java et le marshaller/unmarshaller j'utilise lorsque l'on travaille avec ces objets. Depuis le jaxb.les propriétés ne contient pas de chose d'excitant, je l'ai laissée.