java.util.List是接口,JAXB不能处理接口
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/298733/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.util.List is an interface, and JAXB can't handle interfaces
提问by Shervin Asgari
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
My code worked just well until I changed the return type from List to List<List<RelationCanonical>>
我的代码运行良好,直到我将返回类型从 List 更改为 List<List<RelationCanonical>>
Here is the partial webservice:
这是部分网络服务:
@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) {
......
......
......
}
I have also tried by removing the @SOAPBinding and trying default, but the same result occurs.
Appreciate any help
我也尝试删除@SOAPBinding 并尝试默认,但出现相同的结果。感谢任何帮助
UPDATE
更新
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.
我想注意一点。我把所有的List都改成了ArrayList,然后编译了。我说已编译但没有工作的原因是因为它的行为很奇怪。我得到一个 Object 类型:RelationServiceStub.ArrayList 但该对象没有 get 方法或也不像 List 那样运行。我也尝试将它转换为 List ,但这没有用。
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.
请注意,这是在我使用 Axis 2 和 wsdl2java 之后,所以是的,现在它可以编译,但我不知道如何将数据取出。
采纳答案by Henning
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.
根据我的理解,您将无法List
通过 JAXB处理纯文本,因为 JAXB 不知道如何将其转换为 XML。
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
).
相反,您将需要定义一个 JAXB 类型,其中包含一个List<RelationCanonical>
(我将称之为Type1
),以及另一个包含这些类型的列表的JAXB类型,依次(因为您正在处理 a List<List<...>>
;我将称之为此类型Type2
) .
The result could then be an XML ouput like this:
结果可能是这样的 XML 输出:
<Type2 ...>
<Type1 ...>
<RelationCanonical ...> ... </RelationCanonical>
<RelationCanonical ...> ... </RelationCanonical>
...
</Type1>
<Type1>
<RelationCanonical ...> ... </RelationCanonical>
<RelationCanonical ...> ... </RelationCanonical>
...
</Type1>
...
</Type2>
Without the two enclosing JAXB-annotated types, the JAXB processor has no idea what markup to generate, and thus fails.
如果没有两个封闭的 JAXB 注释类型,JAXB 处理器不知道要生成什么标记,因此失败。
--Edit:
- 编辑:
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;
}
}
and
和
@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;
}
}
You should also check out the JAXB section in the J5EE tutorialand the Unofficial JAXB Guide.
您还应该查看J5EE 教程和非官方 JAXB 指南中的JAXB 部分。
回答by Argo
If that suits your purpose you can always define an array like this:
如果这符合您的目的,您可以随时定义这样的数组:
YourType[]
JAXB can certainly figure out what that is and you should be able to immediatly use it client side. I would also recommend you to do it that way, since you should not be able to modify the array retrieved from a server via a List but via methods provided by the web service
JAXB 当然可以弄清楚那是什么,您应该能够立即在客户端使用它。我还建议您这样做,因为您不应该能够修改通过 List 从服务器检索到的数组,而是通过 Web 服务提供的方法
回答by Nick
If you want to do this for any class.
如果你想为任何班级做到这一点。
return items.size() > 0 ? items.toArray((Object[]) Array.newInstance(
items.get(0).getClass(), 0)) : new Object[0];
回答by Ahmed Mousaad Abdel-Wanees
You can use "ArrayList" instead of inner "List"
您可以使用“ArrayList”而不是内部“List”