Подтвердить что ты не робот

Аннотации JAXB для списков вложенных элементов

У меня есть следующий XML:

<mappings>
    <mapping>
        <parameter attr = "value">asdas</parameter>
        <parameter attr = "value2">d123asdsad</parameter>
        <parameter attr = "value3">0</parameter>
    </mapping>
    <mapping>
        <parameter attr = "value">23123s</parameter>
        <parameter attr = "value2">qwerty</parameter>
        <!-- more parameter elements -->
    </mapping>
    <!-- more mapping elements -->
</mappings>

У меня есть следующие классы java для его сопоставления с:

@XmlRootElement(name = "mappings")
public class Mappings { 
    @XmlElement(name = "mapping")
    private List<Mapping> mMappings;

    public List<Mapping> getMappings() {
        return mMappings;
    }

    public void setMappings(List<Mapping> aMappings) {
        this.mMappings = aMappings;
    }
}

public class Mapping {
    @XmlElement(name = "parameter")
    private List<Parameter> mParameters;

    public List<Parameter> getParameters() {
        return mParameters;
    }

    public void setParameters(List<Parameter> aParameters) {
        this.mParameters = aParameters;
    }
}

public class Parameter {
    @XmlAttribute(name = "attr")
    private String mName;

    @XmlValue
    private String mValue;

    public String getName() {
        return mName;
    }

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

    public String getValue() {
        return mValue;
    }

    public void setValue(String aValue) {
        this.mValue = aValue;
    }
}

Когда я пытаюсь отменить его с помощью

JAXBContext context = JAXBContext.newInstance(BundleMappings.class);
Unmarshaller um = context.createUnmarshaller();
mappings = (BundleMappings)um.unmarshal(new File(myFile));

Я получаю эту ошибку

If a class has @XmlElement property, it cannot have @XmlValue property.

Мне нужен параметр, чтобы иметь атрибут "attr" и контент, так что я делаю неправильно?

4b9b3361

Ответ 1

По умолчанию JAXB (JSR-222) реализует общедоступные свойства (методы get/set) и аннотированные поля как отображаемые (и отдельные). Отображение по умолчанию @XmlElement, поэтому ваши свойства будут считаться отображаемыми таким образом.

Решение № 1

Поскольку вы аннотируете поля, вам нужно добавить @XmlAccessorType(XmlAccessType.FIELD) в свои классы.

@XmlAccessorType(XmlAccessType.FIELD)
public class Parameter {
    @XmlAttribute(name = "attr")
    private String mName;

    @XmlValue
    private String mValue;

    public String getName() {
        return mName;
    }

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

    public String getValue() {
        return mValue;
    }

    public void setValue(String aValue) {
        this.mValue = aValue;
    }
}

Решение №2

Аннотировать методы get (или set).

public class Parameter {
    private String mName;

     private String mValue;

    @XmlAttribute(name = "attr")
    public String getName() {
        return mName;
    }

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

    @XmlValue
    public String getValue() {
        return mValue;
    }

    public void setValue(String aValue) {
        this.mValue = aValue;
    }
}

Дополнительная информация


UPDATE

Вам также необходимо использовать аннотацию @XmlElenent в свойстве mappings, чтобы указать имя элемента должно быть mapping.

@XmlRootElement(name = "mappings")
public class Mappings { 
    private List<Mapping> mMappings;

    @XmlElement(name="mapping")
    public List<Mapping> getMappings() {
        return mMappings;
    }

    public void setMappings(List<Mapping> aMappings) {
        this.mMappings = aMappings;
    }
}