JAXB игнорирует аннотацию @XmlAttribute

#java #xml #annotations #jaxb

#java #xml #аннотации #jaxb

Вопрос:

Кажется, что JAXB игнорирует @XmlAttribute аннотацию и не заполняет attributeName attributeValue атрибуты и . Не могли бы вы помочь мне решить эту проблему?

XML:

 <?xml version="1.0" encoding="UTF-8"?>
<Product>
    <ProductCode>PRD191_5</ProductCode>
    <AttrList>
        <element Name="Toy Type" Value="Quadrocopter"/>
        <element Name="Engine Type" Value="Electric Engine"/>
        <element Name="Build Type" Value="Ready-To-Fly"/>
    </AttrList>
</Product>
 

Классы Java:

 @XmlRootElement(name = "Product")
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
    
    @XmlElement(name = "ProductCode")
    private String productCode;

    @XmlElement(name = "AttrList")
    private List<Attribute> attrList = null;
}
 
 @XmlRootElement(name = "element")
@XmlAccessorType(XmlAccessType.FIELD)
public class Attribute {

    @XmlElement(name="element")
    @Column
    private String element;

    @XmlAttribute(name = "Name", required=true)
    @Column
    private String attributeName;

    @XmlAttribute(name = "Value", required=true)
    @Column
    private String attributeValue;
}

 

Зависимость от Maven:

 <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
 

Ответ №1:

В определении вашей модели есть некоторые ошибки: @XmlElement attrList для атрибута должно быть установлено значение element (элемент, который повторяется), в то время как имя элемента-оболочки <AttrList> должно передаваться вместе с @XmlElementWrapper аннотацией:

 @XmlRootElement(name = "Product")
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
    
    @XmlElement(name = "ProductCode")
    private String productCode;
    
    @XmlElementWrapper(name = "AttrList")
    @XmlElement(name = "element")
    private List<Attribute> attrList = null;
}
 

Вам также следует удалить свойство Java Bean Attribute#element , поскольку оно будет обозначать подэлемент с именем <element> <element> тега.