簡體   English   中英

JAXB:泛型的多態性

[英]JAXB: polymorphism with generics

我正在嘗試使用JAXB(在澤西島內)與泛型的多態性:

@XmlRootElement
public class Performance<M extends IMeasurement> {

    @XmlAnyElement
    private List<M> measurement;   
}
@XmlJavaTypeAdapter(MeasurementAbstract.Adapter.class)
public interface IMeasurement<D extends Serializable, V extends Number>
        extends Serializable {

    D getDate();    
    void setDate(D date);    
    V getValue();    
    void setValue(V value);
}
@XmlTransient
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({MeasurementStringDouble.class, MeasurementStringInteger.class})
public abstract class MeasurementAbstract<D extends Serializable, V extends Number> implements IMeasurement<D, V> {

    @XmlElement
    protected D date;
    @XmlElement
    protected V value;

    static class Adapter extends XmlAdapter<MeasurementAbstract, IMeasurement> {
        public IMeasurement unmarshal(MeasurementAbstract m) { return m; }
        public MeasurementAbstract marshal(IMeasurement v) { return (MeasurementAbstract) v; }
    }
}
@XmlRootElement
public class MeasurementStringDouble extends MeasurementAbstract<String, Double> {}

@XmlRootElement
public class MeasurementStringInteger extends MeasurementAbstract<String, Integer> {}

我有這個錯誤:

GRAVE:響應的映射異常:500(內部服務器錯誤)javax.ws.rs.WebApplicationException:javax.xml.bind.MarshalException - 包含鏈接異常:[javax.xml.bind.JAXBException:class org.test.jaxb.MeasurementStringDouble在這種情況下,也不知道它的任何超類。]

我找到了解決這個問題的解決方案:

@XmlRootElement
public class Performance<M extends IMeasurement> {

    @XmlElementWrapper(name = "measurementsPerformance")
    @XmlElements({
        @XmlElement(name = "measurement", type = MeasurementStringDouble.class),
        @XmlElement(name = "measurement", type = MeasurementStringInteger.class)})
    private List<M> measurement;   
}
public interface IMeasurement<D extends Serializable, V extends Number> extends Serializable {

    D getDate();    
    void setDate(D date);    
    V getValue();    
    void setValue(V value);
}
@XmlTransient
public abstract class MeasurementAbstract<D extends Serializable, V extends Number> implements IMeasurement<D, V>, Serializable {

    protected D date;
    protected V value;
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class MeasurementStringDouble extends MeasurementAbstract<String, Double> {

    @XmlElement
    @Override
    public String getDate() {
        return date;
    }

    @XmlElement
    @Override
    public Double getValue() {
        return value;
    }
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class MeasurementStringInteger extends MeasurementAbstract<String, Integer> {

    @XmlElement
    @Override
    public String getDate() {
        return date;
    }

    @XmlElement
    @Override
    public Integer getValue() {
        return value;
    }
}

此解決方案的缺點是重復子類中的getter / setter。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM