1

このような些細なコードを持つ:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class A {
  @XmlPath("B/text()")
  private String b;

  @XmlPath("C/text()")
  private Integer c;
  ...
}

XMLにapt値がある限り、これは完全に正常に機能します。フィールドに必須のマークを付けたいので、設定されていないか無効なcドキュメントを読み込もうとするたびにMOXyがスローします。c最も簡単な解決策は何ですか?

アップデート:

デフォルト値を設定することもできます。

4

1 に答える 1

1

EclipseLink JAXB(MOXy)またはJAXB実装は、欠落しているノードに対して集合演算を実行しないため、次のようにすることができます。

オプション#1-デフォルトのフィールド値

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class A {
  @XmlPath("B/text()")
  private String b = "fieldDefault";

  @XmlPath("C/text()")
  private Integer c;
}

次のデモコードを使用します。

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(A.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        A a = (A) unmarshaller.unmarshal(new StringReader("<a/>"));

        System.out.println(a.getB());
        System.out.println(a.getC());
    }

}

次の出力が生成されます。

fieldDefault
null

オプション#2-にdefaultValueを指定@XmlElement

アノテーションにdefaultValueを指定できます@XmlElementが、これは空の要素がマーシャリングされていない場合にのみdefaultValueを設定します。

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class A {
  @XmlPath("B/text()")
  @XmlElement(defaultValue="annotationDefault")
  private String b;

  @XmlPath("C/text()")
  @XmlElement(defaultValue="annotationDefault")
  private Integer c;

}

次のデモコードを使用します。

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(A.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        A a = (A) unmarshaller.unmarshal(new StringReader("<a><B/></a>"));

        System.out.println(a.getB());
        System.out.println(a.getC());
    }

}

次の出力が生成されます。

annotationDefault
null

オプション#3-Unmarshaller検証を強制するためににXMLスキーマを指定します

MOXyまたは任意のJAXB実装を使用して、UnmarshallerにXMLスキーマを設定し、入力を検証することができます。

于 2011-08-25T15:47:03.013 に答える