Добавление заголовка мыла для каждого запроса на обслуживание - PullRequest
2 голосов
/ 16 апреля 2019

Сначала я объясню проект. Это интеграционная веб-служба, которая прослушивает запросы и внутренне использует другую веб-службу и обрабатывает ее ответы, чтобы получить желаемый ответ. Мне нужно добавить пользовательский заголовок для каждого запроса во «внутренний» веб-сервис. Я проверил, что при использовании следующей конфигурации обработчик является одноэлементным классом. Мне нужно, чтобы каждый новый запрос к «внутренней службе» создавал новый экземпляр. Я проверил, что иногда заголовки для запроса «A» используют значения для запроса «B». Я инициализирую значения заголовка перед первым «внутренним» запросом (мне нужно вызвать метод «внутреннего» веб-сервиса без каких-либо мыльных заголовков, а затем настроить его, используя значение, содержащееся в первом ответе ). Любые идеи, как я могу сделать эту работу?

Спасибо

//ConfigurationClass

@Bean(name = "internalService")
         @Scope(scopeName="prototype")


            public JaxWsPortProxyFactoryBean internalService() {
                JaxWsPortProxyFactoryBean bean = new JaxWsPortProxyFactoryBean();

                try {
                    bean.setServiceInterface(internalService.class);
                    bean.setWsdlDocumentUrl(new URL("https://localhost/internalService.svc?wsdl" ));
                    bean.setNamespaceUri( "http://schemas.internalService.com/2019/04/");
                    bean.setServiceName("InternalService");
                    bean.setPortName("InternalServicePort");
                    bean.setEndpointAddress("https://localhost/internalService.svc");
                    bean.setHandlerResolver(wsHandlerResolver());

                } catch (MalformedURLException e) {

                    e.printStackTrace();

                }

                return bean;

            }
@Bean(name = "wsHandlerResolver")

            public WebServiceHandlerResolver wsHandlerResolver() {
             WebServiceHandlerResolver wshandlerResolver = new WebServiceHandlerResolver();
             List handlers = new ArrayList();
             handlers.add(webServiceHandler());
             wshandlerResolver.setHandlers(handlers);
                return wshandlerResolver;

            }

 @Bean(name = "webServiceHandler")
            public WebServiceHandler webServiceHandler() {
             WebServiceHandler webServiceHandler = new WebServiceHandler();
                return webServiceHandler;

            }
//HandlerResolver class
public class WebServiceHandlerResolver implements HandlerResolver {

    private List<Handler> handlers;

    public List<Handler> getHandlerChain(PortInfo portInfo) {
        return handlers;
    }

    public void setHandlers(List<Handler> handlers) {
        this.handlers = handlers;
    }
}
//Handler class
public class WebServiceHandler implements SOAPHandler<SOAPMessageContext> {

    private String user;
    private String pass;
    private String source;

    @Override
    public boolean handleMessage(SOAPMessageContext context)  {
             //THIS IS WHERE I ADD THE VALUES
        }

}

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Используйте переменную java.lang.ThreadLocal<YourPropertiesHolder> внутри вашего WebServiceHandler для хранения и доступа к свойствам.Тогда свойства из разных запросов вашего сервиса не будут конфликтовать.

class YourPropertiesHolder {
   String user;
   String pass;
   String source;
}
0 голосов
/ 24 апреля 2019

Наконец-то я смог это сделать.Это была просто проблема с запросом области в классе Handler, мне не хватало опции proxyMode.

@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...