好啊我是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工作,或者这是不可能的<有什么想法吗?
当我完全按照您的问题中的方式运行代码时,我会得到以下结果,这不是您得到的输出吗?
<?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)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗