java.util.List 是一个接口,JAXB 不能处理接口 [英] java.util.List is an interface, and JAXB can't handle interfaces

查看:17
本文介绍了java.util.List 是一个接口,JAXB 不能处理接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在尝试部署我的应用程序时,我似乎遇到了以下异常:

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(我将其称为 Type1),另一个包含一个列表这些类型,依次(当您处理 List<List<...>>;我将把这种类型称为 Type2).

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.

这篇关于java.util.List 是一个接口,JAXB 不能处理接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆