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

时间:2011-05-18 18:10:26

标签: java web-services jaxb jax-ws

我有一个用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
}

例如:

public WsResult<OtherClass> someMethod(...);
public WsResult<Foo> someMethod_2(...);

在客户端:

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();

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

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

可能会发生什么?

修改

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

1 个答案:

答案 0 :(得分:3)

我不确定我是否完全理解你的问题,但对我而言,你似乎期望JAXB在这里有点太多了。您的WsResult在无限制参数T中是通用的,这意味着在运行时除了JAXB的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;