1

有这样一个简单的代码:

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

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

只要我的 XML 中有合适的值,它就可以正常工作。我想c根据需要标记该字段,因此每次我尝试读取c未设置或无效的文档时都会抛出 MOXy。最简单的解决方案是什么?

更新:

设置默认值也可以。

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 on@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 - 在 上指定 XML 模式Unmarshaller以强制验证

使用 MOXy 或任何 JAXB 实现,您可以在 Unmarshaller 上设置 XML 模式以验证输入:

于 2011-08-25T15:47:03.013 回答