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

JAXB抽象类和XmlID/XmlIDREF

平光明
2023-03-14

好啊我是JAXB新手,我对XmlID和XmlIDREF有一些问题,其中ID位于抽象类中。

我的问题是:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso(EntityImpl.class)
public abstract class AbstractEntity {

    @XmlID
    private String id;

    public AbstractEntity() {
        this.id = generateStringId();
    }


    private static String generateStringId() {
        return "urn:uuid:" + UUID.randomUUID().toString();
    }
}
@XmlAccessorType(XmlAccessType.FIELD)
public class EntityImpl extends AbstractEntity {

    private String variabel_l = "1";
    private String variabel_2 = "2";
    private String variabel_3 = "3";
    private String variabel_4 = "4";
}

此类包含一个抽象实体,在本例中是一个字符串。

@XmlAccessorType(XmlAccessType.FIELD)
public class SomeClass {

    @XmlIDREF
    private AbstractEntity ae;
    private String status;

    private SomeClass() {
    }

    public SomeClass(AbstractEntity ae, String status) {
        this.ae= ae;
        this.status = status;
    }

}

此类包含两个列表,一个列表包含“SomeClass”的实例,另一个列表包含“EntityImpl”的实例

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Root {

    @XmlElementWrapper
    @XmlElement(name = "result")
    private List<SomeClass> someClassList = new ArrayList<>();


    @XmlElementWrapper
    @XmlElement(name = "entityImpl")
    private List<EntityImpl> entityImplList = new ArrayList<>();

    public void addResult(SomeClass someClass) {
        this.someClassList.add(someClass);
    }

    public void addEntityImpl(EntityImpl EntityImpl) {
        this.entityImplList.add(EntityImpl);
    }

impl被添加到res,res和impl都被添加到根目录上各自的列表中。

public static void main(String[] args) throws JAXBException {
    Root root = new Root();
    EntityImpl impl = new EntityImpl();

    SomeClass res = new SomeClass(impl, "something");
    root.addEntityImpl(impl);
    root.addResult(res);


    JAXBContext JAXB_CONTEXT;
    JAXB_CONTEXT = JAXBContext.newInstance(Root.class);

    StringWriter writer = new StringWriter();
    JAXB_CONTEXT.createMarshaller().marshal(root, writer);
    System.out.println(writer.getBuffer().toString());


    }

我想要的结果是引用SomeClass实体中impl的Id,但结果是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <someClassList>
        <result>
            <ae xsi:type="entityImpl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <id>urn:uuid:b8a4c0e4-330d-4ed7-9b68-1517d2eb4c2a</id>
                <variabel_l>1</variabel_l>
                <variabel_2>2</variabel_2>
                <variabel_3>3</variabel_3>
                <variabel_4>4</variabel_4>
                <variabel_5>5</variabel_5>
            </ae>
            <status>something</status>
        </result>
    </someClassList>
    <entityImplList>
        <entityImpl>
            <id>urn:uuid:b8a4c0e4-330d-4ed7-9b68-1517d2eb4c2a</id>
            <variabel_l>1</variabel_l>
            <variabel_2>2</variabel_2>
            <variabel_3>3</variabel_3>
            <variabel_4>4</variabel_4>
            <variabel_5>5</variabel_5>
        </entityImpl>
    </entityImplList>
</root>

如果我将@XmlIDREF移动到根实体中的entityImplList,那么引用工作正常,我得到如下结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <someClassList>
        <result>
            <ae xsi:type="entityImpl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <id>urn:uuid:46d0681f-4ec6-49ac-8c22-4954eaa5c680</id>
                <variabel_l>1</variabel_l>
                <variabel_2>2</variabel_2>
                <variabel_3>3</variabel_3>
                <variabel_4>4</variabel_4>
                <variabel_5>5</variabel_5>
            </ae>
            <status>something</status>
        </result>
    </someClassList>
    <entityImplList>
        <entityImpl>urn:uuid:46d0681f-4ec6-49ac-8c22-4954eaa5c680</entityImpl>
    </entityImplList>
</root>

当REF在“SomeClass”中时,是否可以让XmlID/XmlIDREF工作,或者这是不可能的<有什么想法吗?

共有1个答案

归俊捷
2023-03-14

当我完全按照您的问题中的方式运行代码时,我会得到以下结果,这不是您得到的输出吗?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <someClassList>
        <result>
            <ae>urn:uuid:b34f3b9e-1086-4dfc-852f-4bc55b5d5a6e</ae>
            <status>something</status>
        </result>
    </someClassList>
    <entityImplList>
        <entityImpl>
            <id>urn:uuid:b34f3b9e-1086-4dfc-852f-4bc55b5d5a6e</id>
            <variabel_l>1</variabel_l>
            <variabel_2>2</variabel_2>
            <variabel_3>3</variabel_3>
            <variabel_4>4</variabel_4>
        </entityImpl>
    </entityImplList>
</root>

更新

根据我和Ørjan Johansen的调查,在JDK 1.7中包含的JAXB的实现中似乎存在与此用例相关的错误。Windows的0_21。该用例在JDK 1.7中正常工作。Mac的0_21,Windows的jdk1.6.0_45。当Eclipse Link MOXy用作JAXB(JSR-222)提供程序时,此用例也可以正常工作。

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

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

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

  • 我使用JAXB将一些xml解组到一个对象中。 我有一个从抽象类继承的类。我已经将抽象类标记为@XmlTransient。然后使用XMLType PropOrder,我可以访问抽象类中的属性,如下所示: 凉。问题是有时它不是我想访问的元素,而是一个属性。通常,您将使用@XMLAttribute来定义此类属性,以指示值存储在 xml 特性而不是元素中。但是,鉴于我已经在定义了“id”的抽象类上使用了

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

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗