2012-02-25 39 views
2

我有一個像下面這樣的xml。在JAXB代中創建對象

<price> 
    <priceCalculator ie="carID" renderer = "com.a.carCalculator"> 
     <argument name="param1" value="paramValue"/> 
     ..... 
    </priceCalculator> 
    <priceCalculator id="TVS" renderer = "com.a.TwoWheelerCalculator"> 
    <argument name="param1" value="paramValue"/> 
    ..... 
    </priceCalculator> 
</price> 

當解析JAXB時,我想要使用priceCalculator對象創建渲染器類對象。例如,priceCalculator.getRenderrer()應該基於屬性值返回CarCalculator或TwoWheelerCalculator對象。我們可以假設計算器類具有默認構造函數。

我該如何做到這一點?請幫忙。

回答

1

爲了解決這個問題,我會使用Java-to-XML schema mapping mode,我會讓JAXB類成爲「真正」類的構建者。然後,你可以控制它到底是如何解組:

class PriceCalculator { 
    Calculator renderer; 

    PriceCalculator(Builder builder) { 
     Class<?> calculatorClass = Class.forName(builder.renderer); 
     renderer = (Calculator)calculatorClass.newInstance(); 
    } 

    @XmlType(name="PriceCalculator") 
    static class Builder { 
     @XmlAttribute 
     String renderer; 
    } 
} 
0

你可以使用一個XmlAdapter這個用例:

ClassAdapter

XmlAdpater會期間將對象轉換爲它的類名編組,並在unmarshal上實例化指定類的實例。

package forum9444545; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class ClassAdapter extends XmlAdapter<String, Object>{ 

    @Override 
    public String marshal(Object object) throws Exception { 
     if(null == object) { 
      return null; 
     } 
     return object.getClass().getName(); 
    } 

    @Override 
    public Object unmarshal(String string) throws Exception { 
     if(null == string) { 
      return null; 
     } 
     return Thread.currentThread().getContextClassLoader().loadClass(string).newInstance(); 
    } 

} 

PriceCalculator

@XmlJavaTypeAdapter註釋用於註冊的相應字段/屬性的XmlAdapter

package forum9444545; 

import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class PriceCalculator { 

    @XmlAttribute 
    private String id; 

    @XmlAttribute 
    @XmlJavaTypeAdapter(ClassAdapter.class) 
    private Object renderer; 

} 

的更多信息,XmlAdapter