Java ist auch eine Insel

Donnerstag, Dezember 06, 2007

JAXB2-Annotationen an Beispielen

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>

AddThis Social Bookmark Button