加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JAXB 2.x:抽象方法被编组为属性

发布时间:2020-12-15 02:23:57 所属栏目:Java 来源:网络整理
导读:我有一个抽象的根类,让我们说A. 我有几个实现类扩展A. A具有FIELD注释以及一些@XmlElement注释属性. A也有抽象方法. 编组时(B扩展A),抽象方法返回的值被编组为属性.不是预期的,对吧? @XmlAccessorType(XmlAccessType.FIELD)public abstract class SpecialPr
我有一个抽象的根类,让我们说A.

我有几个实现类扩展A.

A具有FIELD注释以及一些@XmlElement注释属性.

A也有抽象方法.

编组时(B扩展A),抽象方法返回的值被编组为属性.不是预期的,对吧?

@XmlAccessorType(XmlAccessType.FIELD)
public abstract class SpecialProfile extends ContentNodeBean {

  @XmlElement(name="do-index",namespace="my")
  private boolean doIndex = false;

  public abstract SpecialProfileType getSpecialProfileType();

  ... getters and setters for properties ...   
}

有没有人有同样的问题,如何解决?

我正在使用org.eclipse.persistence.moxy 2.1.2

解决方法

我试图重现你的问题,但到目前为止都没有成功.你能看到我在做与你不同的事吗?以下是我的示例代码:

一个

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public abstract class A {

    public abstract C getC();
    public abstract void setC(C c);

}

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class B extends A {

    private C c;

    @Override
    public C getC() {
        return c;
    }

    @Override
    public void setC(C c) {
        this.c = c;
    }

}

C

public class C {

}

演示

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import org.eclipse.persistence.Version;

public class Demo {

    public static void main(String[] args) throws Exception {
        System.out.println(Version.getVersionString());

        JAXBContext jc = JAXBContext.newInstance(B.class);
        System.out.println(jc);

        B b = new B();
        b.setC(new C());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(b,System.out);
    }

}

产量

2.1.2.v20101206-r8635
org.eclipse.persistence.jaxb.JAXBContext@100ab23
<?xml version="1.0" encoding="UTF-8"?>
<b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b"><c/></b>

UPDATE

根据您的意见:

> B不继承A的XmlAccessorType设置.
>标记@XmlTransient不是抽象方法,而是用于在B类上实现访问器的字段.

以下是B类应该是什么样子:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class B extends A {

    @XmlTransient
    private C c;

    @Override
    public C getC() {
        return c;
    }

    @Override
    public void setC(C c) {
        this.c = c;
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读