【问题标题】:JAXB generated class field is abstractJAXB 生成的类字段是抽象的
【发布时间】:2017-05-05 03:46:42
【问题描述】:

我已经从 xsd 文件生成了类。

该类包含具有抽象类的字段。这个抽象类有两种不同的实现。我们称之为 Impl1CLass 和 Impl2Class。

我无法修改 xsd 架构,也无法修改生成的类。

我需要做的就是当 jaxb 封送这个类并且抽象字段具有空值时,我需要得到这样的东西:

<dep xsi:type="Impl1Class" xsi:nil="true"/>

生成的类中的这个字段如下所示:

protected Dep dep;

Dep 是抽象类。

所以我需要设置这是 nil 并且类型是特定的(Impl1Class)

我尝试使用 BoundType 作为抽象类创建 XmlAdapter,而 ValueType 是 JAXBElement 但没有运气,因为它需要默认的非参数构造函数,但 JAXBElement 没有这样的构造函数。

备注。换句话说,我想在 xsi:nil="true" 时设置 xsi:type。我该怎么做?

这里是生成的类

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "DepartmentKey"
)
@XmlSeeAlso({GroupDepartmentKey.class, EnterpriseDepartmentKey.class})
public abstract class DepartmentKey {
    public DepartmentKey() {
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "GroupDepartmentKey",
    propOrder = {"serviceProviderId", "groupId", "name"}
)
public class GroupDepartmentKey extends DepartmentKey {
    @XmlElement(
        required = true
    )
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String serviceProviderId;
    @XmlElement(
        required = true
    )
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String groupId;
    @XmlElement(
        required = true
    )
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String name;
    ......
}

在目标类中没有任何注释的字段

protected DepartmentKey department;

【问题讨论】:

    标签: java xml xsd jaxb


    【解决方案1】:

    您可以在调用时使用 setter 方法设置 null。

    Impl1Class impl1Class = new Impl1Class();
    imple1Class.setDep(null);
    

    你可以使用 setter 方法吗?如果没有,您可能需要继承 Impl1Class 并将 Dep 设置为 null。

    希望这会有所帮助!

    【讨论】:

    • 对不起,我没有得到你。我没有二传手。所以你建议扩展 Impl1Class (它实际上是 Dep 类的子实例)并添加 setter 来将 Dep 设置为自身?
    • @Dmitriy 能分享一下Dep和Impl1Class的代码吗?无论哪个类是 Dep 类的包装器,都可以将 Dep 设置为 null。这就是我的回答的意思。
    • 我修改了问题
    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多