2011-06-16 6 views
1

Compte tenu de la classe suivante:personnalisé JAXB sortie xml

public class Customer { 
    public String name; 
    public String lastName; 
} 

Je veux générer la sortie XML suivante à l'aide JAXB pour un client dont name est John et lastName est Doe:

<cst>John Doe</cst> 

Comment Je fais ça avec JAXB?

EDIT

La classe Customer est utilisé dans plusieurs endroits, comme indiqué ici:

public class Sale { 
    private String productId; 
    private Date date; 
    private Customer customer; 
} 

public class Transaction { 
    private List<Sale> sales; 
} 

... et ainsi de suite ... L'accord est, comment puis-je dire JAXB: "chaque fois que vous voyez un client, veuillez utiliser un formatage personnalisé"?

Mon problème est qu'il ya beaucoup de classes qui contiennent un client, et je veux contrôler programatically la sortie (parfois name + lastname, parfois <name>name</name>, <lastname>lastname</lastname>) sans ajout d'annotations à chaque classe qui contient Customer. Cette exigence exclurait l'utilisation de JAXBElement<Customer>.

Répondre

2

Vous pouvez installer une XmlAdapter qui gère la traduction:

public static void main(String[] args) throws Exception { 

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

    Customer customer = new Customer("John", "Doe"); 
    m.marshal(new JAXBElement<CustomerWrapper>(new QName("cwrapper"), CustomerWrapper.class, new CustomerWrapper(customer)), System.err); 

} 

static class CustomerWrapper { 
    private Customer customer; 

    public CustomerWrapper() { 
    } 

    public CustomerWrapper(Customer customer) { 
     this.customer = customer; 
    } 

    public Customer getCustomer() { 
     return customer; 
    } 

    public void setCustomer(Customer customer) { 
     this.customer = customer; 
    } 
} 

@XmlJavaTypeAdapter(CustomerAdapter.class) 
static class Customer { 
    private String name; 
    private String lastName; 
    public Customer() { 
    } 
    public Customer(String name, String lastName) { 
     this.name = name; 
     this.lastName = lastName; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

static class CustomerAdapter extends XmlAdapter<String, Customer> { 

    @Override 
    public Customer unmarshal(String v) throws Exception { 
     String[] ss = v.split(" "); 
     return new Customer(ss[0], ss[1]); 
    } 

    @Override 
    public String marshal(Customer v) throws Exception { 
     return v.getName() + " " + v.getLastName(); 
    } 

} 

sorties

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<cwrapper> 
    <customer>John Doe</customer> 
</cwrapper> 
+0

Merci pour votre réponse, cela me rapprochent de mon objectif ... seriez-vous assez aimable pour voir mon edit? J'ai trop simplifié ma question initiale. Merci! – chahuistle

+0

Ceci est une exigence étrange. Vous pouvez créer des sous-classes de 'Customer' pour chaque type de marshaling et fournir un' XmlAdapter' pour chacun d'eux, mais je ne sais pas si cela fonctionne. – musiKk

+0

s'avère que votre solution fonctionne hors de la boîte ... en utilisant @XmlAdapter rend la magie se produire. – chahuistle