使用jaxb2实现序列化实体类时,如果类中存在泛型属性时,映射为List或者Set时会出现javax.xml.bind.JAXBException错误

当使用jaxb2序列化包含泛型属性的实体类时,可能出现javax.xml.bind.JAXBException错误。解决方法是创建一个包装类来包装List或Set,如ResultTest包装List<Subject>,并用@XmlSeeAlso注解指定泛型类为序列化实体类的子类,从而避免错误并成功转换为XML格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决办法:
使用一个包装类对List或者Set进行包装,如下:

@XmlRootElement(name = "test")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"msg","num","code","list"})
public class ResultTest {

    @XmlElement
    private String msg;
    @XmlElement
    private Integer num;
    @XmlElement
    private Integer code;

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {

        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @XmlElementWrapper(name = "subjects")
    @XmlElement(name = "subject")
    private List<SubjectEntity> list;

    public List<SubjectEntity> getList() {
        return list;
    }

    public void setList(List<SubjectEntity> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        return "ResultTest[" +
                "msg='" + msg + '\'' +
                ", num=" + num +
                ", code=" + code +
                ", list=" + list +
                ']';
    }
}       

通过使用ResultTest这个类将List< Subject >进行包装 ,然后替代泛型后进行序列化,可以成功将内容转为xml格式,泛型类如下:

@XmlRootElement
@XmlSeeAlso({SubjectEntity.class,SubjectList.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class ResultUtil<T> {

    private String msg;

    private Integer num;

    private Integer code;

    @XmlElement(name = "data")
    private T data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    @XmlTransient
    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public ResultUtil(){
    }

    public ResultUtil(ResultCodeEnum resultCodeEnum){
        this.code = resultCodeEnum.getCode();
        this.msg = resultCodeEnum.getMsg();
    }

    public ResultUtil(ResultCodeEnum resultCodeEnum, Integer num){
        this.code = resultCodeEnum.getCode();
        this.msg = resultCodeEnum.getMsg();
        this.num = num;
    }

    public ResultUtil(ResultCodeEnum resultCodeEnum, Integer num, T data) {
        this.msg = resultCodeEnum.getMsg();
        this.num = num;
        this.code = resultCodeEnum.getCode();
        this.data = data;
    }

    public ResultUtil(ResultCodeEnum resultCodeEnum, T data){
        this.msg = resultCodeEnum.getMsg();
        this.code = resultCodeEnum.getCode();
        this.data = data;
    }

    @Override
    public String toString() {
        return "ResultUtil{" +
                "msg='" + msg + '\'' +
                ", num=" + num +
                ", code=" + code +
                '}';
    }
}

如果控制台出现javax.xml.bind.JAXBException: class 以及其任何超类对此上下文都是未知的。这个提示的话,则使用@XmlSeeAlso注解,将该类添加为所序列化实体类的子类即可解决这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值