Рубрики
Без рубрики

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

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

}

пользователь Bo ” вводится с помощью конфигурации компонента 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

Решение

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

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

Чтобы остановить ” wsgen “для создания веб-метода для ” пользователя Bo “, просто добавьте к нему ” @WebMethod(исключить) “, см. Ниже:

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 ” будет игнорировать ” user Bo ” методы получения и установки.

Оригинал: “https://mkyong.com/webservices/jax-ws/spring-jax-ws-xxx-is-an-interface-and-jaxb-cant-handle-interfaces/”