2011-06-16 60 views
1

考慮下面的類:定製JAXB XML輸出

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

我要生成使用JAXB一個客戶,其name是約翰和lastName以下XML輸出是李四:

<cst>John Doe</cst> 

哪有我用JAXB做這件事嗎?

編輯

Customer在多處使用,如下所示:

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

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

......等等......該協議是,我怎麼能告訴JAXB:「每當看到客戶時,請使用自定義格式」?

我的問題是,有包含客戶很多類的,我希望通過編程控制輸出(有時name + lastname,有時<name>name</name><lastname>lastname</lastname>),而不在包含Customer每類中添加註釋。此要求將排除使用JAXBElement<Customer>

回答

2

你可以安裝一個XmlAdapter處理該翻譯:

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(); 
    } 

} 

輸出

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

謝謝您的回答,這讓我更接近我的目標......你會是一種足以看我的編輯?我簡化了我最初的問題。謝謝! – chahuistle 2011-06-16 12:00:11

+0

這是一個奇怪的要求。您可以爲每種類型的編組創建「Customer」的子類,併爲每個類型提供一個'XmlAdapter',但我不知道這是否可行。 – musiKk 2011-06-16 12:09:05

+0

事實證明,您的解決方案可以即裝即用......使用@XmlAdapter可以讓魔法發生。 – chahuistle 2011-06-16 13:38:00