46 votes

java.util.List est une interface et JAXB ne peut pas gérer les interfaces.

Il me semblait pour obtenir de l'exception suivante lorsque vous essayez de déployer mon 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


Mon code fonctionne bien jusqu'à ce que j'ai changé le type de retour de Liste de Liste<List<RelationCanonical>>

Voici la partielle webservice:


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

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


J'ai aussi essayé en enlevant le @SOAPBinding et d'essayer par défaut, mais le même résultat se produit. Reconnaissant de toute aide

Mise à JOUR

Je tiens à souligner quelque chose. J'ai changé toutes les Liste de liste de tableaux, et puis il a réunies. La raison pour laquelle je dis compilé et non travaillé est parce qu'il se comporte de façon étrange. Je reçois un Objet de type: RelationServiceStub.ArrayList mais l'objet n'a pas de méthodes get ou ne se comporte pas comme une Liste. J'ai aussi essayé de la convertir en une Liste, mais qui n'a pas fonctionné.

Notez que c'est après que j'ai utilisé de l'Axe 2 et wsdl2java Donc oui, maintenant, il compile, mais je ne sais pas comment pour obtenir les données.

27voto

Henning Points 8776

Dans ma compréhension, vous ne serez pas en mesure de traiter une plaine List par JAXB, comme JAXB n'a aucune idée de la façon de les transformer en XML.

Au lieu de cela, vous aurez besoin de définir un JAXB type qui est titulaire d'un List<RelationCanonical> (je vais l'appeler Type1), et un autre pour tenir une liste de ces types de, à tour de rôle (que vous avez affaire à un List<List<...>>; je vais l'appeler ce type Type2).

Le résultat pourrait alors être un XML de sortie comme ceci:

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

Sans les deux enfermant JAXB-annotées, des types de JAXB processeur n'a aucune idée de ce balisage pour générer, et échoue donc.

--Edit:

Ce que je veux dire devrait ressembler à quelque chose comme ceci:

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

et

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

Vous devriez également vérifier la JAXB dans la section J5EE tutoriel et l' Officieux JAXB Guide.

8voto

Argo Points 161

Si cela vous convient, vous pouvez toujours définir un tableau comme celui-ci:

 YourType[]
 

JAXB peut certainement comprendre ce que c'est et vous devriez pouvoir l'utiliser immédiatement côté client. Je vous recommanderais également de procéder de cette façon, car vous ne devriez pas pouvoir modifier le tableau extrait d'un serveur via une liste, mais via des méthodes fournies par le service Web.

1voto

Nick Points 11

Si vous voulez faire cela pour n'importe quelle classe.

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

-5voto

Vous pouvez utiliser "ArrayList" au lieu de "List" interne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X