2

次のような擬似コードがあります。

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

そしてそれは次の出力を生成します(これは空の要素がそこにあるというある種のトリックですが、これは私のシステムでどのように機能するかなので、私の前の誰かがこれをこのように設定しました):

<alma><korte/></alma>

それは私にとっては問題ありません。しかし、私がそれをアンマーシャリングすると、空の文字列は正しくアンマーシャリングされませんが、korteはnullになります。空の要素を空の文字列にアンマーシャリングするjaxbを作成するにはどうすればよいですか?

JDK6バンドルjaxbを使用しています。

編集:

アルマ級は次のようになります(クラスの名前は変更されていますが、次のようになっています)。

@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;
4

1 に答える 1

1

JAXB実装は、文字列プロパティの「」として空の要素を非整列化する必要があります。解決策は、この修正を含むJAXB実装の新しいバージョンにアップグレードすることです。

以下の例は、JDK1.6.0_20およびEcliseLinkJAXB(MOXy)2.3に含まれているバージョンのJAXBを使用して機能しました。

デモ

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

アルマ

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;
    }

}
于 2011-06-21T13:22:06.520 に答える