Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为每个服务请求添加soap头_Java_Spring_Web Services - Fatal编程技术网

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

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

首先,我将解释这个项目。它是一个集成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;

            }
//HandlerResolver类
公共类WebServiceHandlerResolver实现HandlerResolver{
私有列表处理程序;
公共列表getHandlerChain(PortInfo PortInfo){
返回处理程序;
}
公共void集合处理程序(列表处理程序){
this.handlers=handlers;
}
}
//处理程序类
公共类WebServiceHandler实现SOAPHandler{
私有字符串用户;
私人串通;
私有字符串源;
@凌驾
公共布尔handleMessage(SOAPMessageContext上下文){
//这是我添加值的地方
}
}

在WebServiceHandler中使用
java.lang.ThreadLocal
变量来存储和访问属性。这样,来自不同服务请求的属性就不会冲突

class YourPropertiesHolder {
   String user;
   String pass;
   String source;
}

我终于做到了。这只是处理程序类中的作用域请求有问题,我缺少proxyMode选项


@Scope(value=WebApplicationContext.Scope\u请求,proxyMode=ScopedProxyMode.TARGET\u类)

感谢您的解释。我撤消标记可能的重复项。:)我不太确定我是否做对了。这就是我所更改的:
公共类WebServiceHandler实现SOAPHandler{private ThreadLocal properties=new ThreadLocal();公共void setProperties(WebServiceHandlerProperties threadProperties){properties.set(threadProperties);}
然后我为每个请求创建一个WebServiceHandlerProperties,然后使用处理程序setter,但我认为我缺少了一些东西
 @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
        }

}
class YourPropertiesHolder {
   String user;
   String pass;
   String source;
}