Spring JAX-WS: «xxx» - это интерфейс, а JAXB не может обрабатывать интерфейсы

Проблема

Интегрируйте Spring JAX-WS, см. Веб-сервис ниже:

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

}

« UserBo » - это DI через конфигурацию бина Spring XML. Но когда служба генерирует файлы службы (через wsgen ) для развертывания, появляется сообщение об ошибке « JAXB не может обрабатывать интерфейсы », см. Ниже:

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

Решение

Смотрите это unofficial JAXB guide чтобы узнать, как отобразить интерфейс в JAXB.

Однако ваш случай отличается, просто нет смысла генерировать метод веб-службы для « userBo », который требуется только для Di через Spring, а не для публикации на клиенте.

Чтобы прекратить « wsgen » для генерации веб-метода для « userBo », просто добавьте к нему «@WebMethod (exclude = true)` », см. Ниже:

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

}

Теперь « wsgen » будет игнорировать методы получения и установки « userBo ».

ссылка://тег/jax-ws/[jax-ws]ссылка://тег/jaxb/[jaxb]ссылка://тег/весна/[весна]