Spring JAX-WS: ‘xxx’ est une interface et JAXB ne peut pas gérer les interfaces.

Problème

Intégrez Spring JAX-WS, voir le service Web ci-dessous:

package com.mkyong.user.ws;//imports...

@WebService()
public class PGUserWS {

   //DI via Spring
    private UserBo userBo;

    public UserBo getUserBo() {
        return userBo;
    }

    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    @WebMethod(operationName = "addUser")
    public boolean addUser(@WebParam(name = "userId")
    String userId, @WebParam(name = "User")
    User user) throws SOAPException {

        userBo.addUser(userId, user);
        return true;
    }

}

Le « userBo » est DI via la configuration du bean Spring XML. Toutefois, lorsque le service génère les fichiers du service (via wsgen ) pour le déploiement, il génère le message d’erreur « JAXB ne peut pas gérer les interfaces », voir ci-dessous:

Caused by: java.security.PrivilegedActionException:
    com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:
            2 counts of IllegalAnnotationExceptions
    com.mkyong.user.bo.UserBo is an interface, and JAXB can't handle interfaces.
        this problem is related to the following location:
                at com.mkyong.user.bo.UserBo
                at private com.mkyong.user.bo.UserBo com.mkyong.user.ws.jaxws.SetUserBo.arg0
                at com.mkyonguser.ws.jaxws.SetUserBo
    com.mkyong.user.bo.UserBo does not have a no-arg default constructor.
        this problem is related to the following location:
                at com.mkyong.user.bo.UserBo
                at private com.mkyong.user.bo.UserBo com.mkyong.user.ws.jaxws.SetUserBo.arg0
                at com.mkyong.user.ws.jaxws.SetUserBo

Solution

Consultez le unofficial JAXB guide pour savoir comment mapper une interface dans JAXB.

Cependant, votre cas est différent, il n’a aucun sens de générer une méthode de service Web pour « userBo », qui n’est nécessaire que pour Di via Spring, et non pour publication sur le client.

Pour arrêter « wsgen » et générer une méthode Web pour « userBo », il suffit de l’annoter avec «` @WebMethod (exclude = true) `», voir ci-dessous:

package com.mkyong.user.ws;
//imports...

@WebService()
public class PGUserWS {

    private UserBo userBo;

    @WebMethod(exclude = true)
    public UserBo getUserBo() {
        return userBo;
    }

    @WebMethod(exclude = true)
    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    @WebMethod(operationName = "addUser")
    public boolean addUser(@WebParam(name = "userId")
    String userId, @WebParam(name = "User")
    User user) throws SOAPException {

        userBo.addUser(userId, user);
        return true;
    }

}

Maintenant, “ wsgen ” ignorera les méthodes de lecture et de définition de “ userBo ”.

lien://tag/jax-ws/[jax-ws]lien://tag/jaxb/[jaxb] spring