2013-07-09 26 views
7

Tôi đang cố gắng sử dụng JAXB (bên Jersey) cho đa hình với Generics:JAXB: đa hình với Generics

@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> {} 

Tôi có lỗi này:

GRAVE: Mapped exception to response: 500 (Internal Server Error) javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException - with linked exception: [javax.xml.bind.JAXBException: class org.test.jaxb.MeasurementStringDouble nor any of its super class is known to this context.]

Trả lời

3

Tôi đã tìm thấy giải pháp để giải quyết vấn đề này:

@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; 
    } 
} 

Hạn chế của giải pháp này là lặp lại trong các getters/setters trong sub-class.