Unmarshal使用List <T>字段在泛型上生成空字段

lpi*_*.eu 5 java web-services jax-ws jaxb

我有一个用Java(1.6)创建的Web服务,使用maven的metro(2.0),在Tomcat 6下.在所有Web方法中,返回类型是泛型类:

public class WsResult<T> {
    protected T result;          // the actual result
    protected Code requestState; // 0K, or some error code if needed
    protected String message;    // if error, instead of result, insert a message
}
Run Code Online (Sandbox Code Playgroud)

例如:

public WsResult<OtherClass> someMethod(...);
public WsResult<Foo> someMethod_2(...);
Run Code Online (Sandbox Code Playgroud)

在客户端:

MyServiceService service = new MyServiceService();
MyService port = service.getMyServicePort();

WsResult result = port.someMethod(...);
OtherClass oc = (OtherClass) result.getResult();

WsResult res = port.someMethod_2(...);
Foo o = (Foo) res.getResult();
Run Code Online (Sandbox Code Playgroud)

在一些网络方法中,它正在运作.但是当结果是具有List<? class>属性的类时,它无法解组.

该项目是最大项目的一部分.因此,出于测试目的,我创建了一个新的,更简单的,只是项目,使用相同的数据模型,并复制其中一个Web方法,在这种情况下它工作,并且在unmarshal之后,我有一个结果,我可以投射到预期的类型.

可能会发生什么?

编辑:

答案是肯定的解决方案,但会为添加到字段声明中的每种类型生成一个getter.有没有更好的办法?

Wal*_*inz 3

我不太确定我是否完全理解您的问题,但对我来说,您对 JAXB 的期望似乎有点过高。您的WsResult不受限制的参数是通用的,这意味着在运行时除了 JAXB 可以使用的引用T之外什么都没有剩下。Object

宽泛地说,JAXB 真正需要处理这种情况的是,提示要实例化哪个类来填充该result字段。要填写此内容,您应该

  • 创建具体的子类WsResult(例如,按照您的示例,class OtherClassResult extends WsResult<OtherClass>--当您在 JAXB 中抛出 时OtherClassResult,它会知道result需要是 的实例,OtherClass并且有机会采取相应的行动,或者
  • 用 注释该result字段@XmlElements,如下所示:
@XmlElements({
    @XmlElement(name = "text", type = String.class), // add more elems here
    @XmlElement(name = "other", type = OtherClass.class)})
protected Object result;
Run Code Online (Sandbox Code Playgroud)