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

查看:60
本文介绍了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>

这是部分网络服务:


@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 那样运行.我也尝试将其转换为 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;我将称这种类型为 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天全站免登陆