我有一个用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。 有更好的方法吗?
答案 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;