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

带有@XmlTransient的JAXB抽象类

束帅
2023-03-14

我使用JAXB将一些xml解组到一个对象中。

我有一个从抽象类继承的类。我已经将抽象类标记为@XmlTransient。然后使用XMLType PropOrder,我可以访问抽象类中的属性,如下所示:

@XmlType( propOrder = { "id"...

凉。问题是有时它不是我想访问的元素,而是一个属性。通常,您将使用@XMLAttribute来定义此类属性,以指示值存储在 xml 特性而不是元素中。但是,鉴于我已经在定义了“id”的抽象类上使用了 XMLTransient,当我尝试将字段标记为@XMLAttribute时,JAXB 会抱怨。

JAXB抱怨我试图访问/返回同名的两个字段。

有人能告诉我正确的方向吗?我正在为GAE建设,所以我真的不想使用任何其他图书馆。

提前感谢!

共有1个答案

邢博文
2023-03-14

以下是你可以做的几件事:

可以用< code>@XmlAttribute对父类的属性进行批注。

import javax.xml.bind.annotation.*;

@XmlTransient
public class Foo {

    private String att1;
    private String att2;

    @XmlAttribute
    public String getAtt1() {
        return att1;
    }

    public void setAtt1(String att1) {
        this.att1 = att1;
    }

    public String getAtt2() {
        return att2;
    }

    public void setAtt2(String att2) {
        this.att2 = att2;
    }

}

酒吧

可以重写子类上的属性,并使用 @XmlAttribute对其进行批注。

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Bar extends Foo {

    @Override
    @XmlAttribute
    public String getAtt2() {
        return super.getAtt2();
    }

    @Override
    public void setAtt2(String att2) {
        super.setAtt2(att2);
    }

}

演示

下面是一些演示代码,您可以运行这些代码来展示一切正常。

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Bar.class);

        Bar bar = new Bar();
        bar.setAtt1("a");
        bar.setAtt2("b");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(bar, System.out);
    }

}

输出

以下是运行演示代码的输出:

<?xml version="1.0" encoding="UTF-8"?>
<bar att1="a" att2="b"/>
 类似资料:
  • 问题内容: 我正在尝试使用JAXB解组一些XML,但出现“无法创建…的实例”异常。我知道为什么- 它试图建立一个抽象类的实例。我想要的是让它成为特定实现类的实例。我的目标是对setter方法进行特定于类的检查。对于BarImpl,也许“ qux”是有效的baz值,但BarImpl2想要做其他事情。 我没有通过注释Foo来实现这一目标,但是如果我不注释bar,事情就会变得很丑。 问题答案: 您可以执

  • 好啊我是JAXB新手,我对XmlID和XmlIDREF有一些问题,其中ID位于抽象类中。 我的问题是: 此类包含一个抽象实体,在本例中是一个字符串。 此类包含两个列表,一个列表包含“SomeClass”的实例,另一个列表包含“EntityImpl”的实例 impl被添加到res,res和impl都被添加到根目录上各自的列表中。 我想要的结果是引用SomeClass实体中impl的Id,但结果是:

  • 大家好,我正在尝试使用Dagger-Hilt,我想知道如何实现这个代码? Gradle返回此错误: 这是生成的Java类: 非常感谢您的帮助。

  • 问题内容: 我有一个包含带有抽象超类的JAXB注释类的程序包。我想在Web服务接口中使用此超类,因此可以将任何子类作为参数传递。当我这样做时,会引发异常: 可以手动将marshall / unmarshall&参数作为字符串传递,但我想避免这种情况。有什么想法怎么做? 问题答案: 您是否在Web服务请求中指定了具体的实现?这对我来说很好: 抽象基类: 实现类: Web服务方法: 请求:

  • 我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的示例如下: 我所有的尝试(甚至编组)都失败了。我浏览了BlaiseDoughan的博客,包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html但他们似乎对我的例子都没有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中

  • 是否有任何JAXB绑定可以告诉JAXB代码生成器将Java类生成为,而不必在XSD中将相应的XML类型标记为? 情况如下: > 我在xsd中定义架构: 我使用内联JAXB绑定(“inline”==“直接在模式中”)来指示应该生成JAXB类的包(): 我使用内联JAXB绑定为我的每个复杂类型(在本例中、和)指示实现类的名称: 我从模式生成JAXB类。这导致: 我自己编写类: 使用这两个类层次结构这样