Spring JAX-WS: 'xxx' ist eine Schnittstelle, und JAXB kann keine Schnittstellen verarbeiten

Problem

Integrieren Sie Spring + JAX-WS, siehe Webdienst unten:

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

}

Das " userBo " ist DI über die Konfiguration des Spring XML-Beans. Wenn der Dienst jedoch die Dateien des Diensts (über wsgen ) für die Bereitstellung generiert, wird die Fehlermeldung " JAXB kann Schnittstellen nicht verarbeiten " angezeigt, siehe unten:

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

Lösung

In diesem unofficial JAXB-Handbuch erfahren Sie, wie Sie das Interface in JAXB zuordnen.

Ihr Fall ist jedoch anders, es macht einfach keinen Sinn, eine Web-Service-Methode für „ userBo “ zu generieren, die nur für Di via Spring erforderlich ist und nicht für den Client.

Um " wsgen " anzuhalten, um die Webmethode für " userBo " zu generieren, kommentieren Sie sie einfach mit "@WebMethod (exclude = true)", siehe unten:

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

}

Jetzt ignoriert " wsgen " die Getter- und Setter-Methoden " userBo ".

Verbindung://Tag/Jax-ws/[Jax-Ws] spring