Illustration einer tropischen Insel mit Palmen und einem hohen Berg

Java Blog für Programmierer

JAXB2-Annotationen an Beispielen

· Christian Ullenboom

Schreiben der Felder statt Nutzen der Setter/Getter: Annotiere die Klasse mit

@XmlAccessorType( XmlAccessType.FIELD )

@XmlAttribute

class Person

{

 String name;

 @XmlAttribute

 int id;

}

<person id="123″>

 <name>Christian</name>

</person>

@XmlValue

Gibt es nur ein Element kann @XmlValue dies in den Rumpf setzten.

class Person

{

 int id;

}

<person>

 <id>123</id>

</person>

class Person

{

 @XmlValue int id;

}

<person>123</person>

@Transient

Nimmt Element aus der XML-Abbildung aus.

class Person

{

 @XmlTransient int id;

 String firstname;

 String lastname;

}

<person>

 <firstname>Christian</firstname>

 <lastname>Ullenboom</lastname>

</person>

@XmlList

Schreibt Elemente einer Sammlung nicht in einzelnen Elementen, sondern mit Leerzeichen getrennt.

class Person

{

 List<String> emails;

}

<person>

 <emails>muh@kuh.de</emails>

 <emails>zick@zack.com</emails>

</person>

class Person

{

 @XmlList

 List<String> emails;

}

<person>

 <emails>muh@kuh.de zick@zack.com</emails>

</person>

Elemente einpacken mit @XmlElementWrapper

class Person

{

 List<String> emails;

}

<person>

 <emails>muh@kuh.de</emails>

 <emails>zick@zack.com</emails>

</person>

class Person

{

 @XmlElementWrapper(name = "emails")

 @XmlElement(name = "email")

 List<String> emails;

}

<person>

 <emails>

 <email>muh@kuh.de</email>

 <email>zick@zack.com</email>

 </emails>

</person>

Reihenfolge ändern

class Person

{

 String lastname, firstname;

}

<person>

 <lastname>Ullenboom</lastname>

 <firstname>Christian</firstname>

</person>

@XmlType( propOrder = { "firstname", "lastname" } )

class Person

{

 String lastname, firstname;

}

<person>

 <firstname>Christian</firstname>

 <lastname>Ullenboom</lastname>

</person>

@XmlJavaTypeAdapter

Anpassen der XML-Abbildung, etwa für Datumswerte.

class Person

{

 Date birthday;

}

<person>

 <birthday>1973-03-12T00:00:00+01:00</birthday>

</person>

class Person

{

 @XmlJavaTypeAdapter( DateAdapter.class )

 Date birthday;

}

class DateAdapter extends XmlAdapter<String, Date>

{

 private final static DateFormat formatter = new SimpleDateFormat( "dd/MM/yyyy" );

public Date unmarshal( String date ) throws ParseException

 {

 return formatter.parse( date );

 }

public String marshal( Date date )

 {

 return formatter.format( date );

 }

}

<person>

 <birthday>12/03/1973</birthday>

</person>

Der spezielle Datentyp XMLGregorianCalendar

Neben der Möglichkeit, Datumswerte mit einen XmlJavaTypeAdapter zu übersetzen, bietet JAXB den Datentype XMLGregorianCalendar.

 
Person p = new Person();

GregorianCalendar c = new GregorianCalendar( 1973, Calendar.MARCH, 12 );

p.birthday = DatatypeFactory.newInstance().newXMLGregorianCalendar( c );;
 
 
class Person

{

 XMLGregorianCalendar birthday;

}

<person>

 <birthday>1973-03-12T00:00:00.000+01:00</birthday>

</person>
 

Die Abbildung enthält alle notwendigen Werte. Sollen Segmente, wie die Zeitzone herausgenommen werden, so markiert man sie aus:

 
Person p = new Person();

GregorianCalendar c = new GregorianCalendar( 1973, Calendar.MARCH, 12 );

XMLGregorianCalendar gc = DatatypeFactory.newInstance().newXMLGregorianCalendar( c );

gc.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

gc.setTime(DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
p.birthday = gc;
 
class Person

{

 XMLGregorianCalendar birthday;

}

<person>

 <birthday>1973-03-12</birthday>

</person>

Elemente einbetten mit @XmlElements

Person p = new Person();

EmailContact c1 = new EmailContact();

c1.address = "hoho@weihnachtsmann.de";

PhoneContact c2 = new PhoneContact();

c2.number = "0011-123456789";

p.contacts = Arrays.asList( c1, c2 );

@XmlRootElement

@XmlAccessorType( XmlAccessType.FIELD )

class Person

{

 @XmlElements(

 {

 @XmlElement( name = "email", type = EmailContact.class ),

 @XmlElement( name = "phone", type = PhoneContact.class )

} )

 List<Object> contacts = new ArrayList<Object>();

}

@XmlAccessorType( XmlAccessType.FIELD )

class EmailContact

{

 @XmlValue

 String address;

}

@XmlAccessorType( XmlAccessType.FIELD )

class PhoneContact

{

 @XmlValue

 String number;

}

<person>

 <email>hoho@weihnachtsmann.de</email>

 <phone>0011-123456789</phone>

</person>

Kategorien: Allgemein

2 Kommentare

Christian ·

Danke für die Zusammenstellung. Hat einige meiner Kopfschmerzen gelindert :-)

Die bisherigen Kommentare wurden aus WordPress übernommen. Neue Kommentare sind derzeit geschlossen.

← Alle Beiträge