2012-02-25 46 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