Pergunta

Eu parecia ter a seguinte exceção ao tentar implantar o meu aplicativo:

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


Meu código funcionou muito bem até que eu mudei o tipo de retorno da lista de List >

Aqui está o webservice parcial:


@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) {

......
......
......
}


Eu também tentei removendo o @SOAPBinding e tentando padrão, mas o mesmo resultado ocorre. Agradeço qualquer ajuda

Atualizar

quero ressaltar algo. I mudou tudo Lista de ArrayList, e então compilado. A razão pela qual eu digo compilado e não trabalhou é porque ele tem um comportamento estranho. Eu recebo um objeto do tipo: RelationServiceStub.ArrayList mas o objeto não tem métodos get ou não se comporta como uma lista de qualquer um. Eu também tentou convertê-lo para uma lista, mas que não funcionava.

Note que esta é depois de eu ter usado Eixo 2 e wsdl2java Então, sim, agora ele compila, mas eu não sei como obter os dados.

Foi útil?

Solução

No meu entendimento, você não será capaz de processar um List simples via JAXB, como JAXB não tem idéia de como transformar isso em XML.

Em vez disso, você precisará definir um tipo JAXB que detém uma List<RelationCanonical> (vou chamá-lo Type1), e outro para manter uma lista dos tipos, por sua vez (como você está lidando com um List<List<...>>; I vai chamar este tipo Type2).

O resultado poderia, então, ser um ouput XML como este:

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

Sem os dois tipos anotada-JAXB que encerram, o processador JAXB não tem nenhuma ideia do que marcação para gerar e, assim, falhar.

- Edit:

O que quero dizer deve olhar um pouco como este:

@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;
    }
}

e

@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;
    }
}

Você também deve verificar se o href="http://java.sun.com/javaee/5/docs/tutorial/doc/bnazf.html" seção JAXB no tutorial J5EE eo Unofficial Guide JAXB .

Outras dicas

Se que combina com seu efeito, você pode sempre definir uma matriz como este:

YourType[]

JAXB certamente pode descobrir o que é isso e você deve ser capaz de usá-lo imediatamente do lado do cliente. Eu também recomendo que você fazê-lo dessa forma, desde que você não deve ser capaz de modificar a matriz recuperado de um servidor através de uma lista, mas através de métodos fornecidos pelo serviço web

Se você quiser fazer isso para qualquer classe.

return items.size() > 0 ? items.toArray((Object[]) Array.newInstance(
            items.get(0).getClass(), 0)) : new Object[0];

Você pode usar "ArrayList" em vez de interior "List"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top