问题描述
在尝试部署我的应用程序时,我似乎遇到了以下异常:
I seemed to get the following exception when trying to deploy my application:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions java.util.List is an interface, and JAXB can't handle interfaces. this problem is related to the following location: at java.util.List at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse java.util.List does not have a no-arg default constructor. this problem is related to the following location: at java.util.List at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
我的代码运行良好,直到我将返回类型从 List 更改为 List<List<RelationCanonical>>
这里是部分网络服务:
@Name("relationService") @Stateless @WebService(name = "RelationService", serviceName = "RelationService") @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) public class RelationService implements RelationServiceLocal { private boolean login(String username, String password) { Identity.instance().setUsername(username); Identity.instance().setPassword(password); Identity.instance().login(); return Identity.instance().isLoggedIn(); } private boolean logout() { Identity.instance().logout(); return !Identity.instance().isLoggedIn(); } @WebMethod public List<List<RelationCanonical>> getRelationsFromPerson(@WebParam(name = "username") String username, @WebParam(name = "password") String password, @WebParam(name = "foedselsnummer") String... foedselsnummer) { ...... ...... ...... }
我也尝试过删除@SOAPBinding 并尝试默认值,但会出现相同的结果.感谢任何帮助
更新
我想说明一些事情.我把所有的List都改成了ArrayList,然后编译了.我之所以说已编译但无法正常工作是因为它的行为很奇怪.我得到一个类型的对象:RelationServiceStub.ArrayList但该对象没有 get 方法或也不表现为 List.我也尝试将其转换为列表,但没有奏效.
I want to note out something. I changed all List to ArrayList, and then it compiled. The reason why I say compiled and not worked is because it behaves strange. I get an Object of type: RelationServiceStub.ArrayList but the object has no get methods or does not behave as a List either. I also tried to cast it to a List but that didnt work.
请注意,这是在我使用了 Axis 2 和 wsdl2java 之后,所以是的,现在它可以编译了,但我不知道如何获取数据.
Note that this is after I have used Axis 2 and wsdl2java So yes, now it compiles, but I dont know how to get the data out.
推荐答案
据我了解,您将无法通过 JAXB 处理纯 List,因为 JAXB 不知道如何转换它成 XML.
In my understanding, you will not be able to process a plain List via JAXB, as JAXB has no idea how to transform that into XML.
相反,您需要定义一个 JAXB 类型,该类型包含一个 List
Instead, you will need to define a JAXB type which holds a List<RelationCanonical> (I'll call it Type1), and another one to hold a list of those types, in turn (as you're dealing with a List<List<...>>; I'll call this type Type2).
结果可能是这样的 XML 输出:
The result could then be an XML ouput like this:
<Type2 ...> <Type1 ...> <RelationCanonical ...> ... </RelationCanonical> <RelationCanonical ...> ... </RelationCanonical> ... </Type1> <Type1> <RelationCanonical ...> ... </RelationCanonical> <RelationCanonical ...> ... </RelationCanonical> ... </Type1> ... </Type2>
如果没有两个封闭的 JAXB 注释类型,JAXB 处理器不知道要生成什么标记,因此会失败.
Without the two enclosing JAXB-annotated types, the JAXB processor has no idea what markup to generate, and thus fails.
--
我的意思应该是这样的:
What I mean should look somewhat like this:
@XmlType public class Type1{ private List<RelationCanonical> relations; @XmlElement public List<RelationCanonical> getRelations(){ return this.relations; } public void setRelations(List<RelationCanonical> relations){ this.relations = relations; } }
和
@XmlRootElement public class Type2{ private List<Type1> type1s; @XmlElement public List<Type1> getType1s(){ return this.type1s; } public void setType1s(List<Type1> type1s){ this.type1s= type1s; } }
您还应该查看 J5EE 教程中的 JAXB 部分 和 非官方 JAXB 指南.
You should also check out the JAXB section in the J5EE tutorial and the Unofficial JAXB Guide.