Как распаковать пустой элемент в пустую строку с помощью JAXB - PullRequest
2 голосов
/ 21 июня 2011

Существует псевдокод, подобный следующему:

Alma alma = new Alma();
alma.setKorte(""); //Korte is a string member
marshaller.marshal(alma, stringwriter);
System.out.println(stringwriter.toString());

И он выдает результат (Я знаю, что это какая-то хитрость, что пустой элемент есть, но именно так он работает в моемсистема, так что кто-то до меня установил это так):

<alma><korte/></alma>

Что хорошо для меня.Но когда я отменю маршалинг, пустая строка не будет правильно распределена, но korte будет нулевым.Как заставить jaxb разархивировать пустой элемент в пустую строку?

Я использую JDK6 в комплекте.

РЕДАКТИРОВАТЬ:

Класс alma выглядит так (имя класса изменено, но это так):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Alma", propOrder = {
    "korte"
})
public class Alma
    implements Serializable
{

    private final static long serialVersionUID = 100L;
    @XmlElement(required = true)
    protected String korte;

1 Ответ

1 голос
/ 21 июня 2011

Реализации JAXB должны демонтировать пустые элементы как "" для свойств String. Решением будет обновление до новой версии вашей реализации JAXB, содержащей это исправление.

Пример ниже работал для меня, используя версию JAXB, включенную в JDK 1.6.0_20 и EcliseLink JAXB (MOXy) 2.3 .

Демо

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

public class Demo {

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

        String xmlString = "<alma><korte/></alma>";
        StringReader xmlReader = new StringReader(xmlString);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Alma alma = (Alma) unmarshaller.unmarshal(xmlReader);

        System.out.println(alma.getKorte().length());
    }

}

выход

0

Alma

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
@XmlType(name = "Alma", propOrder = { "korte" })
public class Alma implements Serializable {

    private final static long serialVersionUID = 100L;

    @XmlElement(required = true)
    protected String korte;

    public String getKorte() {
        return korte;
    }

    public void setKorte(String korte) {
        this.korte = korte;
    }

}
...