java.util.List是一个接口,JAXB无法处理接口
在尝试部署我的应用程序时,我似乎遇到了以下异常:
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>
这是部分内容网络服务:
@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。 我还尝试将其转换为列表,但没有成功。
请注意,这是在我使用 Axis 2 和 wsdl2java 之后,所以是的,现在它可以编译,但我不知道如何获取数据。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
根据我的理解,您将无法通过 JAXB 处理普通的
List
,因为 JAXB 不知道如何将其转换为 XML。相反,您需要定义一个包含
List
的 JAXB 类型(我将其称为Type1
),以及另一个包含这些类型列表的 JAXB 类型,依次(当您处理List
时;我将调用此类型>
Type2
)。结果可能是这样的 XML 输出:
如果没有两个封闭的 JAXB 注解类型,JAXB 处理器不知道要生成什么标记,因此会失败。
--编辑:
我的意思应该看起来有点像这样:
并且
您还应该查看 J5EE 教程中的 JAXB 部分 和非官方 JAXB 指南。
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.Instead, you will need to define a JAXB type which holds a
List<RelationCanonical>
(I'll call itType1
), and another one to hold a list of those types, in turn (as you're dealing with aList<List<...>>
; I'll call this typeType2
).The result could then be an XML ouput like this:
Without the two enclosing JAXB-annotated types, the JAXB processor has no idea what markup to generate, and thus fails.
--Edit:
What I mean should look somewhat like this:
and
You should also check out the JAXB section in the J5EE tutorial and the Unofficial JAXB Guide.
如果这适合您的目的,您始终可以像这样定义一个数组:
JAXB 当然可以弄清楚它是什么,您应该能够立即在客户端使用它。 我还建议您这样做,因为您不应该能够通过列表而是通过 Web 服务提供的方法来修改从服务器检索的数组
If that suits your purpose you can always define an array like this:
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
如果您想为任何课程执行此操作。
If you want to do this for any class.
我收到的错误消息与您的错误消息完全相同(法语):
遇到了同样的问题,我在 Web 方法的声明中返回了一个
java.util.List
,我得到了一个java.util.List 。
在客户端代码中,我只需调用RelationCanonicalArray.getItem()
即可获取java.util.List
。 我使用 Jakarta EE 9.1 和 Wildfly 26.1.1 进行了测试。 Henning 的答案是正确的,但是当 JAXB 已经支持RelationCanonical
时,为什么还要让事情变得如此复杂呢?I had exactly the same error message than yours (in French):
I had the same problem and I returned a
java.util.List<RelationCanonical[]>
in the declaration of the web method, I got ajava.util.List<RelationCanonicalArray>
in the client side code and I just had to callRelationCanonicalArray.getItem()
to get ajava.util.List<RelationCanonical>
. I tested with Jakarta EE 9.1 with Wildfly 26.1.1. Henning's answer is correct but whenRelationCanonical
is already supported by JAXB, why driving things so much more complicated?您可以使用“ArrayList”代替内部“List”
You can use "ArrayList" instead of inner "List"