Маршаллинг через WebServiceGatewaySupport завершается неудачно с JAXBException: класс <classname>, ни один из его суперклассов не известен в этом контексте - PullRequest
0 голосов
/ 13 октября 2019

Я хочу вызывать веб-сервисы через клиентов. Клиенты создаются в виде bean-компонентов:

@Configuration
public class ServiceClientConfiguration {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath(CONTEXT_PATH);
        return marshaller;
    }

    @Bean
    public Service1Client authenticate(Jaxb2Marshaller marshaller) {
        Service1Client client = new Service1Client();
        client.setDefaultUri("http://localhost:8292/service1");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }

    @Bean
    public Service2Client broker(Jaxb2Marshaller marshaller) {
        Service2Client client = new Service2Client();
        client.setDefaultUri("http://localhost:8192/service2");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }

Хотя обе службы различаются, запрос и ответы определяются с помощью xsd-файлов для одного и того же имени пакета, которое предоставляется здесь в виде строки 'CONTEXT_PATH'к маршаллеру.

Клиенты выглядят так:

public class Service1Client extends WebServiceGatewaySupport { 
    private static final Logger log = LoggerFactory.getLogger(Tools.getClassName());

    public Service1Response process(Service1Request request) {

        Service1Response response = null;
        try {
            response = (Service1Response) getWebServiceTemplate()
                .marshalSendAndReceive("http://localhost:8292/service1", request);
        } catch (Exception e) {
            log.error("", e);
        }

        return response;
    }
}

и

public class Service2Client extends WebServiceGatewaySupport { 
    private static final Logger log = LoggerFactory.getLogger(Tools.getClassName());

    public Service2Response process(Service2Request request) {

        Service2Response response = null;
        try {
            response = (Service2Response) getWebServiceTemplate()
                .marshalSendAndReceive("http://localhost:8192/service2", request);
        } catch (Exception e) {
            log.error("", e);
        }
        return response;
    }
}

При нормальном запуске Service1Client Service2Client завершается ошибкой с

javax.xml.bind.JAXBException: class <package>.Service2Request nor any of its super class is known to this context.

Я удалил «Service1Client» из кода - но ошибка осталась прежней.

1 Ответ

0 голосов
/ 14 октября 2019

Я переименовал путь к CONTEXT_PATH. Это были "типы". Я изменил это на «dto». Теперь все работает как положено. Для меня причина проблемы выглядит довольно странно - может быть, кто-то может объяснить это.

...