当前位置: 首页 > 知识库问答 >
问题:

JAXB:具有泛型的多态性

胥承
2023-03-14

我试图使用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。绑定MarshalException——带有链接异常:[javax.xml.bind.jaxbeException:class org.test.jaxb.MeasurementStringDouble,其任何超类在此上下文中都不为人所知。]

共有1个答案

公冶浩慨
2023-03-14

我找到了解决这个问题的方法:

java prettyprint-override">@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;
    }
}

这个解决方案的缺点是重复子类中的getters/setters。

 类似资料:
  • 我尝试使用thajaxb来整理xml,我使用xjc命令从xsd文件order.xsd生成java类 我得到了许多带注释的类,但没有一个@XmlRootElement(name="Order"),也没有名为Order的类

  • 问题内容: 所以我有一张地图: 我会像这样添加元素: 我有如下通用方法: 现在,这段代码可以很好地工作,并且没有编译器问题: 但是,当我尝试这样做时: 编译器向我显示以下警告:类型安全:通用方法verifyType(String,Class)的未经检查的调用verifyType(String,Class) 这让我感到困惑…请帮助… 问题答案: 更改: 至 通过仅将类型声明为“ Class”,就失去

  • 我正在尝试用来自spring WebFlux的WebClient制作一个客户端库。 服务器返回如下JSON所示的响应: 结果字段包含元素数组,这些元素可以根据使用的API而不同。 有关该API的更多信息,请参阅ServiceNow产品中的表API。 正如您在文档中所看到的,API路径如下所示:GET/now/table/{tableName},其中tableName可以是不同的值,tipology

  • 问题内容: 我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。 我可以: 要么: 但我不能两者都做。有没有办法做到这一点? 问题答案: 实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样: 请参见sun.com上的泛型教程,特别是页面底部的“ 绑定类型参数”部分。实际上,如果需要,你可以列出多个接口,并& InterfaceName根

  • 它是关于java中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。我想我在图片中缺少一些东西来让它工作。 事情是这样的... 这是工作 : 这不起作用: java编译器告诉我: 好吧,就是这样。提前感谢大家!希望它能在未来帮助别人! P、 D:这不是枚举类型的问题。它发生在类和层次结构之间。所以别怪Enum了,我试过了,但没用。 对于泛型参数 我们可以做一个一般规

  • 问题内容: 我正在尝试使用JAXB的自省功能来编组和分解所有使用JAXB批注标记的现有域对象。大多数事情都按预期运行,但是要获得一个相当简单的类进行序列化,我会遇到很多麻烦。此类在许多bean上用作@XmlElement,看起来像: 我尝试执行以下操作,但没有成功,JAXB仍然对接口Comparable感到愤怒。 将Range和DoubleRange都用作bean getter的返回类型会产生如下