giovedì 23 febbraio 2012

JAXB e XmlAdapters livello di pacchetto

Il XmlAdapter meccanismo in JAXB ( JSR-222 ) permette una classe unmappable per essere convertito in un mappabile uno. Un XmlAdapter possono essere registrati con i XmlJavaTypeAdapter @ al, campo della proprietà, tipo o livello di pacchetto. Questo post si concentrerà sulla portata delle XmlAdapterquando registrato a livello di pacchetto.


Pacchetto 1 - xmladapter.bar 

package-info

Quando un XmlAdapter è registrato a livello di pacchetto deve includere il tipo di parametro. Il tipo diparametro specifica la classe Java che questo XmlAdapter verrà applicato. Per questo pacchetto (xmladapter.bar ) si precisano un XmlAdapter ( StringAdapter ) che verranno applicate a tutti i campi / proprietà di tipo String all'interno di questo pacchetto.
1.@ XmlJavaTypeAdapters ({
2.@ XmlJavaTypeAdapter (valore = StringAdapter. class , type = String.class )
3.})
4.pacchetto xmladapter.bar;
5. 
6.importazione javax.xml.bind.annotation.adapters *.;

StringAdapter

nostri XmlAdapter si limiterà a convertire tutte le istanze di String in maiuscolo quando marshalling:


. 01package xmladapter.bar;
02. 
03.importazione javax.xml.bind.annotation.adapters.XmlAdapter;
04. 
05.pubblico class StringAdapter extends XmlAdapter <String, <stringa {
06. 
07.@ Override
08.pubblico unmarshal String (String v) throws Exception {
09.ritorno v;
10.}
11. 
12.@ Override
13.pubblico String marshal (String v) throws Exception {
14.se nullo == v) {
15.ritorno v;
16.}
17.ritorno v.toUpperCase ();
18.}
19. 
20.}

Bar 

Bar rappresenta un POJO in questo pacchetto con una proprietà di ( nome ) di tipo String :


. 01package xmladapter.bar;
02. 
03.pubblico class Bar {
04. 
05.private String name;
06. 
07.pubblico getName String () {
08.return nome;
09.}
10. 
11.pubblico void setName (String name) {
12.questo name = nome.;
13.}
14. 
15.}

Pacchetto 2 - xmladapter.foo 

Foo 

Foo rappresenta un oggetto di dominio con una proprietà di tipo String che esiste in un pacchetto differente ( xmladapter.foo ). Le XmlAdapter abbiamo registrato per la xmladapter.bar pacchetto non si applica ai String  campi / proprietà di questa classe:


. 01package xmladapter.foo;
02. 
03.import javax.xml.bind.annotation *.;
. 04import xmladapter.bar.Bar;
05. 
06.@ XmlRootElement
07.@ XmlType (propOrder = { "name" "bar" })
08.pubblico class Foo {
09. 
10.private String name;
11.private bar Bar;
12. 
13.pubblico getName String () {
14.return nome;
15.}
16. 
17.pubblico void setName (String name) {
18.questo name = nome.;
19.}
20. 
21.pubblico getBar Bar () {
22.ritorno bar;
23.}
24. 
25.pubblico void setBar (Bar bar) {
26.questo bar = bar.;
27.}
28. 
29.}

Demo

Il seguente codice creare istanze sia di Foo e Bar e il maresciallo li XML. Si noti come i valori impostati innome di proprietà sia per Foo e Bar sono minuscole:


01.pacchetto xmladapter;
02. 
03.import javax.xml.bind *.;
. 04import xmladapter.bar.Bar;
05.import xmladapter.foo.Foo;
06. 
07.pubblico class {Demo
08. 
09.pubblici static void main (String [] args) throws Exception {
10.JAXBContext jc = JAXBContext.newInstance (Foo. classe , Bar. classe);
11.Marshaller marshaller = jc.createMarshaller ();
12.marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true );
13. 
14.Foo foo = nuovo Foo ();
15.foo.setName ( "foo" );
16. 
17.bar Bar = nuovo Bar ();
18.bar.setName ( "bar" );
19.foo.setBar (bar);
20. 
21.marshaller.marshal (foo, System.out);
22.}
23. 
24.}

Output

Notate come il valore del nome dell'elemento all'interno bar è stato convertito in maiuscolo (linea 5), ma il nome elemento all'interno di foo non ha (linea 3):


1.<? xml version "1.0" encoding "UTF-8" ?>
2.foo >
3.nome > foo </ name >
4.bar >
5.nome > BAR </ name >
6.</ bar >

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.