@XmlElement и бесполезный параметр 'required'

Я положил @XmlElement (name = "title", required = true) до свойства javabean int some_property и не присваивает значение some_property. По какой-то причине это свойство не встречается в сгенерированном XML. Итак, пожалуйста, объясните значение required

некоторые значимые части кода:

@XmlRootElement(name = "book")
@XmlType(propOrder = { "author", "name", "publisher", "isbn" })
public class Book {

private String name;
private String author;
private String publisher;
private String isbn;

// If you like the variable name, e.g. "name", you can easily change this
// name for your XML-Output:
@XmlElement(name = "title",required = true)
public String getName() {
    return name;
}
....

Где-то внутри Главная:

    // create books
    Book book1 = new Book();
    book1.setIsbn("978-0060554736");

    book1.setAuthor("Neil Strauss");
    book1.setPublisher("Harpercollins");
    bookList.add(book1);


    Book book2 = new Book();
    book2.setIsbn("978-3832180577");
    book2.setName("Feuchtgebiete");
    book2.setAuthor("Charlotte Roche");
    book2.setPublisher("Dumont Buchverlag");
    bookList.add(book2);

    JAXBContext context = JAXBContext.newInstance(Bookstore.class);
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

    // Write to System.out
    m.marshal(bookstore, System.out);

    // Write to File
    m.marshal(bookstore, new File(BOOKSTORE_XML));

    // get variables from our xml file, created before
    System.out.println();
    System.out.println("Output from our XML File: ");
    Unmarshaller um = context.createUnmarshaller();
    Bookstore bookstore2 = (Bookstore) um.unmarshal(new FileReader(BOOKSTORE_XML));
    ArrayList<Book> list = bookstore2.getBooksList();

Ответ 1

Что required Вкл. @XmlElement

Свойство required в аннотации @XmlElement влияет на XML-схему, созданную из классов Java.

Модель домена (корень)

Ниже приведена простая Java-модель. Обратите внимание, что свойство bar имеет required=true и свойство foo не имеет значения.

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement
    private String foo;

    @XmlElement(required=true)
    private String bar;

    @XmlElement(nillable=true)
    private String baz;

}

Демо-код

Ниже приведен код, демонстрирующий, как создать XML-схему с помощью JAXBContext.

import java.io.IOException;
import javax.xml.bind.*;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class GenerateSchema {

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

        jc.generateSchema(new SchemaOutputResolver() {
            @Override
            public Result createOutput(String namespaceUri,
                    String suggestedFileName) throws IOException {
                StreamResult result = new StreamResult(System.out);
                result.setSystemId(suggestedFileName);
                return result;
            }
        });
    }

}

Сгенерированная схема XML

Ниже приведенная XML-схема отмечает, что элемент XML, соответствующий полю foo, имеет minOccurs="0", в то время как элемент XML, соответствующий полю bar (который был аннотирован с помощью @XmlElement(required=true)), это не так. по умолчанию minOccurs равен 1, что необходимо.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root" type="root"/>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:element name="foo" type="xs:string" minOccurs="0"/>
      <xs:element name="bar" type="xs:string"/>
      <xs:element name="baz" type="xs:string" nillable="true" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Если вы хотите элемент для null Значения

Модель домена (корень)

Поле baz было аннотировано с помощью @XmlElement(nillable=true). Если значение равно null, в результате XML-элемент будет использовать атрибут xsi:nil. Без этой аннотации нулевые значения будут рассматриваться как отсутствующие узлы.

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement
    private String foo;

    @XmlElement(required=true)
    private String bar;

    @XmlElement(nillable=true)
    private String baz;

}

Демо-код

import javax.xml.bind.*;

public class MarshalDemo {

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

        Root root = new Root();

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

}

Выход

Ниже приведенный XML-код запускает демонстрационный код.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <baz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</root>

Ответ 2

От: http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlElement.html

публичное абстрактное логическое значение

Настройте объявление элемента, которое требуется. Если требуется() верно, то свойство Javabean сопоставляется с объявлением элемента схемы XML с minOccurs = "1" . maxOccurs является "1" для однозначного свойства и "неограниченным" для многозначного свойства.

Если required() является ложным, тогда свойство Javabean отображается на объявление элемента XML-схемы с minOccurs = "0". maxOccurs является "1" для однозначного свойства и "неограниченным" для многозначного свойства.

Ваше свойство сопоставляется с элементом, который (надеюсь) объявлен как требуется в схеме. Ваш сгенерированный XML не соответствует этой конкретной схеме, которая более или менее соответствует тому, что я ожидал от экземпляра, который не "играет по правилам", который он изложил

Ответ 3

Не могли бы вы показать нам образец вашего кода и сгенерированный xml? Согласно документам:

Если требуется true, свойство Javabean отображается в XML-схему элемент с minOccurs = "1". maxOccurs - "1" для одного значащее свойство и "неограниченный" для многозначного свойства.