2011-05-18 50 views
5

我有一个使用maven在Tomcat 6下使用maven(2.0)在Java(1.6)中创建的Web服务。 在所有Web方法中,返回类型是通用的类:Unmarshal在列表上生成空字段<T>字段

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方法,在这种情况下,它的工作,并在解组后,我有一个结果,我可以投到预期类型。

会发生什么情况?

编辑:

答案是一个解决方案是,但生成用于添加到该字段声明中的每个类型的吸气剂。 有没有更好的方法?

+1

你能从测试项目中发布相关片段吗? – 2011-05-24 13:27:35

+0

对不起,现在只是评论,但我很忙。使用示例编辑帖子。 – 2011-05-25 11:21:05

回答

3

我不太确定如果我完全理解你的问题,但对我来说,看起来你对JAXB的期望有点太高了。您的WsResult在不受限制的参数T中是通用的,这意味着在运行时除JDBB可以使用的参考外没有其他内容。

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; 
+0

为了让它工作,我使用了WsResult的具体子类,但我想将其更改为泛型。我没有理解第二个选项,结果字段是什么?我没有领域。客户端变量或Web方法体变量? – 2011-05-25 13:46:13

+0

所以我想你将不得不与选项2(或其他一些我不知道的选项)。 – Waldheinz 2011-05-25 13:53:23

+0

我的意思是'WsResult'中的受保护T结果,这应该得到注释。它们在运行时可用,因此JAXB可以确定要做什么。 – Waldheinz 2011-05-25 13:54:47