1

以下を使用します。

@XmlRootElement(name = "purchase")
@XmlType(propOrder = {"memberId", "propertyA", "propertyB", "propertyC", "listProps"})
public class ClassA {

    private Long memberId;
    private Integer propertyA;
    private String propertyB;
    private Integer propertyC;
    private List<ClassB> listProps;

    public ClassA() {
    }

    @XmlElement(name = "memberId")
    public Long getMemberId() {
        return memberId;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

    @XmlElement(name = "propertyA")
    public Integer getPropertyA() {
        return propertyA;
    }

    public void setPropertyA(Integer propertyA) {
        this.propertyA = propertyA;
    }

    @XmlElement(name = "propertyB")
    public String getPropertyB() {
        return propertyB;
    }

    public void setPropertyB(String propertyB) {
        this.propertyB = propertyB;
    }

    @XmlElement(name = "propertyC")
    public Integer getPropertyC() {
        return propertyC;
    }

    public void setPropertyC(Integer propertyC) {
        this.propertyC = propertyC;
    }

    @XmlElement(name = "listProps")
    public List<ClassB> getListProps() {
        return listProps;
    }

    public void setListProps(List<ClassB> listProps) {
        this.listProps = listProps;
    }
}
@XmlRootElement(name = "listProp")
@XmlType(propOrder = {"countA", "countB"})
public class ClassB {

    private int countA;
    private int countB;

    public ClassB() {
    }

    public int getCountA() {
        return countA;
    }

    public int getCountB() {
        return countB;
    }

    @XmlElement(name = "countA")
    public void setCountA(int countA) {
        this.countA = countA;
    }

    @XmlElement(name = "countB")
    public void setCountB(int countB) {
        this.countB = countB;
    }
}

ClassA 型のオブジェクトをマーシャリング/アンマーシャリングしようとすると、入れたオブジェクトの数に関係なく、listProps は常に空になります。誰が私が間違っているのか教えてもらえますか?

4

2 に答える 2

0

私が理解しているように、あなたの問題は、マーシャリングした値のリストをアンマーシャリングすることです。XMLに少なくとも1つの要素が含まれているときにアンマーシャリングすると空のリストになるときに、jaxb-impl lib +2.2.xで直面した同じ問題。メソッド getListProps でリストが null の場合は、リストをインスタンス化して、JAXB がデータを入力できるようにします。null setListProps が空のコレクションで呼び出されるため、デフォルトではリストを作成せず、既存のリストを使用しようとするため、問題は List + XmlAccessorType.PROPERTY にあるように感じます。

于 2013-09-24T10:39:49.543 に答える
0

モデルクラスを次のようにマーシャリングすると:

import java.util.*;
import javax.xml.bind.*;

public class Demo {

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


        List<ClassB> classBs = new ArrayList<ClassB>();
        classBs.add(new ClassB());
        classBs.add(new ClassB());

        ClassA classA = new ClassA();
        classA.setListProps(classBs);

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

}

次の出力が得られるので、リスト プロパティに問題はありません。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purchase>
    <listProps>
        <countA>0</countA>
        <countB>0</countB>
    </listProps>
    <listProps>
        <countA>0</countA>
        <countB>0</countB>
    </listProps>
</purchase>
于 2013-05-29T15:42:52.863 に答える