猿问

为每个服务请求添加soap标头

首先,我将解释该项目。它是一个集成 Web 服务,它侦听请求并在内部使用另一个 Web 服务并处理其响应以获得所需的答案。我需要为“内部”Web 服务的每个请求添加一个自定义标头。我已经检查过使用下一个配置,处理程序是一个单例类。我需要对“内部服务”的每个新请求都创建一个新实例。我检查过有时请求“A”的标头使用请求“B”的值。我在第一个“内部”请求之前初始化标头的值(我需要调用没有任何soap标头的“内部”Web服务的方法,然后使用第一个响应中包含的值进行设置)。


谢谢


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

    }



摇曳的蔷薇
浏览 197回答 2
2回答

杨__羊羊

在 WebServiceHandler 中使用java.lang.ThreadLocal<YourPropertiesHolder>变量来存储和访问属性。然后来自您服务的不同请求的属性不会冲突。class&nbsp;YourPropertiesHolder&nbsp;{ &nbsp;&nbsp;&nbsp;String&nbsp;user; &nbsp;&nbsp;&nbsp;String&nbsp;pass; &nbsp;&nbsp;&nbsp;String&nbsp;source;}

开满天机

最后我能够做到。这只是 Handler 类中范围请求的问题,我缺少 proxyMode 选项。@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
随时随地看视频慕课网APP

相关分类

Java
我要回答