Как пометить поля как обязательные / необязательные при чтении XML с помощью MOXy? - PullRequest
1 голос
/ 25 августа 2011

Имея такой простой код:

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

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

Это работает абсолютно нормально, если у меня есть подходящие значения в моем XML. Я хотел бы пометить поле c как требуется, поэтому MOXy throw каждый раз, когда я пытаюсь прочитать документ, где c либо не установлен, либо недействителен. Какое самое простое решение?

Обновление:

Установка значений по умолчанию также подойдет.

1 Ответ

1 голос
/ 25 августа 2011

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 - укажите схему XML в Unmarshaller для принудительной проверки

Используя MOXy или любую реализацию JAXB, вы можете установить схему XML в Unmarshaller, чтобы проверять ввод:

...