Je mets @XmlElement (name = "title", required = true) avant la propriété javabean int some_property , et n'attribue pas de valeur à some_property . Pour une raison quelconque, cette propriété n'est pas apparue dans le XML généré. Alors, s'il vous plaît, expliquez le sens de requis
quelques parties significatives du code:
@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;
}
....
Quelque part dans le Main :
// 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();
required
sur @XmlElement
La propriété required
de l'annotation @XmlElement
affecte le schéma XML généré à partir de classes Java.
Modèle de domaine (racine)
Vous trouverez ci-dessous un modèle Java simple. Notez que la propriété bar
a required=true
et la propriété foo
pas.
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;
}
Code de démonstration
Vous trouverez ci-dessous un code qui montre comment générer un schéma XML à l'aide de la variable 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;
}
});
}
}
Schéma XML généré
Ci-dessous, le schéma XML obtenu indique comment l'élément XML correspondant au champ foo
a minOccurs="0"
tandis que l'élément XML correspondant au champ bar
(annoté avec @XmlElement(required=true)
ne le fait pas. Ceci est dû au fait que la valeur par défaut minOccurs
est égale à 1, ce qui est requis.
<?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
Modèle de domaine (racine)
Le champ baz
a été annoté avec @XmlElement(nillable=true)
. Si la valeur est null, l'élément XML résultant utilisera l'attribut xsi:nil
. Sans cette annotation, les valeurs nulles seront traitées comme des nœuds absents.
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;
}
Code de démonstration
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);
}
}
Sortie
Vous trouverez ci-dessous le XML résultant de l'exécution du code de démonstration.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<baz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</root>
De: http://docs.Oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlElement.html
public abstract boolean required
Personnalisez la déclaration d'élément à utiliser . Si required () est true, la propriété Javabean est mappée sur une déclaration d'élément de schéma XML avec minOccurs = "1". maxOccurs est "1" pour une propriété unique et "non lié" pour une propriété à plusieurs valeurs.
Si required () est false, la propriété Javabean est mappée à la déclaration d'élément de schéma XML avec minOccurs = "0". maxOccurs est "1" pour une propriété unique et "non lié" pour une propriété à plusieurs valeurs.
Votre propriété est mappée sur un élément déclaré (espérons-le) comme requis dans le schéma. Votre XML généré n'est pas conforme à ce schéma particulier, ce qui correspond plus ou moins à ce que j'attendais d'une instance qui ne "respecte pas les règles" qu'elle a énoncée.
Pourriez-vous nous montrer un échantillon de votre code et généré XML? Selon docs:
Si requis est true, la propriété Javabean est mappée sur un schéma XML déclaration d'élément avec minOccurs = "1". maxOccurs est "1" pour un seul propriété évaluée et "sans limite" pour une propriété à valeurs multiples.