50

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

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 一样。我也尝试将其转换为列表,但没有奏效。

请注意,这是在我使用了 Axis 2 和 wsdl2java 之后,所以是的,现在它可以编译了,但我不知道如何获取数据。

4

4 回答 4

28

据我了解,您将无法List通过 JAXB 处理纯文本,因为 JAXB 不知道如何将其转换为 XML。

相反,您需要定义一个 JAXB 类型,该类型包含 a List<RelationCanonical>(我将其称为Type1),然后再定义一个包含这些类型的列表(当您处理 a 时List<List<...>>,我将其称为此类型Type2) .

结果可能是这样的 XML 输出:

<Type2 ...>
    <Type1 ...>
        <RelationCanonical ...> ... </RelationCanonical>
        <RelationCanonical ...> ... </RelationCanonical>
        ...
    </Type1>
    <Type1>
        <RelationCanonical ...> ... </RelationCanonical>
        <RelationCanonical ...> ... </RelationCanonical>
        ...
    </Type1>
    ...
</Type2>

如果没有两个封闭的 JAXB 注释类型,JAXB 处理器不知道要生成什么标记,因此会失败。

- 编辑:

我的意思应该看起来像这样:

@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 部分。

于 2008-11-18T14:39:50.123 回答
8

如果这适合您的目的,您始终可以像这样定义一个数组:

YourType[]

JAXB 当然可以弄清楚那是什么,您应该能够立即在客户端使用它。我也建议您这样做,因为您不应该能够修改通过 List 而是通过 Web 服务提供的方法从服务器检索到的数组

于 2009-07-13T12:48:31.783 回答
1

如果您想为任何课程执行此操作。

return items.size() > 0 ? items.toArray((Object[]) Array.newInstance(
            items.get(0).getClass(), 0)) : new Object[0];
于 2011-10-31T23:35:23.517 回答
-5

您可以使用“ArrayList”而不是内部“List”

于 2013-09-12T01:49:16.163 回答