Создавайте объекты внутри поколения JAXB - PullRequest
2 голосов
/ 25 февраля 2012

У меня есть xml, как ниже единицы.

<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 на основе значения атрибута.Можно предположить, что класс калькулятора имеет конструктор по умолчанию.

Как мне этого добиться?Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Для чего-то хитрого, подобного этому, я бы использовал режим отображения схемы Java-XML , и я хотел бы, чтобы класс 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 голосов
/ 25 февраля 2012

Вы можете использовать XmlAdapter для этого варианта использования:

ClassAdapter

XmlAdpater преобразует объект в его имя класса во время маршала,и создать экземпляр указанного класса на немаршале.

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

...