问题描述
我正在尝试使用 JAXB(在 Jersey 内部)进行泛型的多态性:
I'm trying to use JAXB (inside Jersey) for polymorphism with 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> {}
我有这个错误:
GRAVE:将异常映射到响应:500(内部服务器错误)javax.ws.rs.WebApplicationException:javax.xml.bind.MarshalException -带有链接异常:[javax.xml.bind.JAXBException:类org.test.jaxb.MeasurementStringDouble 或其任何超类都是在这种情况下已知.]
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.]
推荐答案
我找到了解决这个问题的方法:
I found a solution to solve this problem:
@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.
The drawback of this solution is duplicate the getters/setters in sub-classes.