необязательный атрибут JAXB xml при сортировке

Когда я упорядочиваю объект Java с помощью JAXB, я получаю элемент ниже xml

<error line="12" column="" message="test" />

Но я хочу xml, как показано ниже

<error line="12" message="test" />

Если значение столбца пусто, мне нужно получить xml, как показано выше, иначе мне нужно получить атрибут столбца в элементе.

Есть ли способ получить его?


person Suresh    schedule 04.11.2012    source источник


Ответы (1)


Атрибут будет выведен с пустым значением String только в том случае, если соответствующее поле/свойство содержит пустое значение String. Если значение равно null, атрибут не будет упорядочен.

Корень

package forum13218462;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    @XmlAttribute
    String attributeNull;

    @XmlAttribute
    String attributeEmpty;

    @XmlAttribute(required=true)
    String attributeNullRequired;

}

Демо

package forum13218462;

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.attributeNull = null;
        root.attributeEmpty = "";
        root.attributeNullRequired = null;

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

Вывод

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root attributeEmpty=""/>
person bdoughan    schedule 04.11.2012
comment
Спасибо за решение. Как сделать то же самое в случае с примитивными типами (например, int)? - person Suresh; 04.11.2012
comment
@Suresh - Вы имеете в виду, что за int вы получаете foo="0"? Вместо этого вы можете изменить поле/свойство на Integer. Затем, когда он имеет нулевое значение, он не будет записывать атрибут. - person bdoughan; 04.11.2012
comment
@BlaiseDoughan, можете ли вы сказать, как сконструировать xsd, чтобы иметь примитивную оболочку вместо примитивного типа в сгенерированном из него классе? У меня есть это: ‹xs:attribute name=fromFraction type=xs:float use=необязательно по умолчанию=0.0/›, и он генерирует поле fromFraction как float, а затем я не могу избавиться от него в результирующем XML. - person Line; 23.08.2017