JAXB没有按预期进行编组。 DTO中的对象(超类)为空

时间:2015-03-19 07:34:01

标签: inheritance jboss jaxb cxf data-transfer-objects

经过几个小时的尝试和错误,我想在这里询问是否有人可以帮助我解决我的问题。

情景:

  • Java EE Server(JBoss 7.2),Apache CXF作为JAX-WS实现。
  • ServiceA(服务端点)和ServiceB(扩展服务A以及服务端点)
  • 三个持久性项目:Common,PersistenceA取决于Common,PersistenceB取决于PersistenceA。
  • 有一个类UUIDIdentified是所有持久化类的超类(它提供了JPA @ID)它在Projekt Common中

在ServiceA类中有一个方法:public List<DTO> getData(UUIDIdentified value);

服务器读取一些对象,这些对象都是UUIDIdentified的子类型,目标是在DTO中打包对象。

DTO看起来像:

@XmlAccessorType(XmlAccessType.FIELD)
public class DTO{

private static final long serialVersionUID = 1L;

@XmlElement(name = "uuididentified")
UUIDIdentified object;

public UUIDIdentified getObject() {
    return object;
}

public void setObject(final UUIDIdentified object) {
    this.object = object;
}
}

如果我查看SOAP响应,我发现<uuididentified>标记中没有数据。我对JAXB的理解不是很好,但据我所知,UUIDIdentified的“真实”实例及其类型对于JAXBContext是未知的。

我可以通过将@XmlSeeAlso({TypeA.class,TypeB.class})添加到UUIDIdentified类来解决此问题(我估计)。但这是我不能理解的,因为如果我这样做,Project Common将取决于Projects PersistenceA / B.

我该如何解决这个问题。我怎么能对JAXB(可能在xml配置文件中)说它必须在JAXBContext中添加ClassA / B,因为它添加了UUIDIdentified?

我在SEI上尝试了一些像jaxb.in​​dex文件,ObjectFactorys,@ XmlSeeAlso这样的东西,但我不知道这是不是正确的方法。

1 个答案:

答案 0 :(得分:0)

在我试图通过我自己编组/解组对象后,@XmlJavaTypeAdapter我遇到了问题的根源。这与JAXBContect没有任何关系。问题是我的对象是一个Hibernate-Envers读取对象,并且envers生成代理对象(即使它们是EAGER)。

因此,编组程序无法从Proxy对象中提取实际值。