首先,我将解释该项目。它是一个集成 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 classpublic class WebServiceHandlerResolver implements HandlerResolver { private List<Handler> handlers; public List<Handler> getHandlerChain(PortInfo portInfo) { return handlers; }
2 回答

杨__羊羊
TA贡献1943条经验 获得超7个赞
在 WebServiceHandler 中使用java.lang.ThreadLocal<YourPropertiesHolder>
变量来存储和访问属性。然后来自您服务的不同请求的属性不会冲突。
class YourPropertiesHolder { String user; String pass; String source;}

开满天机
TA贡献1786条经验 获得超13个赞
最后我能够做到。这只是 Handler 类中范围请求的问题,我缺少 proxyMode 选项。
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
添加回答
举报
0/150
提交
取消