Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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 使用SpringWeb服务为每个请求提供不同的ClientInterceptor_Java_Spring_Spring Boot_Spring Ws_Webservicetemplate - Fatal编程技术网

Java 使用SpringWeb服务为每个请求提供不同的ClientInterceptor

Java 使用SpringWeb服务为每个请求提供不同的ClientInterceptor,java,spring,spring-boot,spring-ws,webservicetemplate,Java,Spring,Spring Boot,Spring Ws,Webservicetemplate,我通过扩展WebServiceGatewaySupport创建了一个定制的web服务客户端,还实现了定制ClientInterceptor来记录一些请求/响应数据。 我必须为每个调用创建新的拦截器,因为它必须存储有关请求的一些数据 当我给我的客户打两个或两个以上的电话时,问题就出现了。第一个请求使用其clientId应用自己的拦截器。第二个也应该这样做。但是,由于两个请求在我的客户端中使用相同的WebServicetemplate,因此第二个请求将拦截器替换为自己的拦截器,并在那里使用它的cli

我通过扩展
WebServiceGatewaySupport
创建了一个定制的web服务客户端,还实现了定制
ClientInterceptor
来记录一些请求/响应数据。 我必须为每个调用创建新的拦截器,因为它必须存储有关请求的一些数据

当我给我的客户打两个或两个以上的电话时,问题就出现了。第一个请求使用其
clientId
应用自己的拦截器。第二个也应该这样做。但是,由于两个请求在我的客户端中使用相同的
WebServicetemplate
,因此第二个请求将拦截器替换为自己的拦截器,并在那里使用它的
clientId

因此,我应该向控制台获得以下输出:

Request: clientId-1
Request: clientId-2
Response: clientId-1
Response: clientId-2
但我明白了:

Request: clientId-1
Request: clientId-2
Response: clientId-2
Response: clientId-2
下面是一些代码示例(仅用于理解它应该如何工作):

@数据
班级反应{
私有最终字符串结果;
公共响应(字符串结果){
this.result=结果;
}
}
@资料
类请求{
私有最终字符串名;
私有最终字符串lastName;
}
@资料
类上下文{
私有最终字符串clientId;
}
@资料
类客户端{
私有最终字符串clientId;
私有最终字符串名;
私有最终字符串lastName;
}
类CustomInterceptor扩展ClientInterceptorAdapter{
私有最终字符串clientId;
公共CustomInterceptor(字符串clientId){
this.clientId=clientId;
}
@凌驾
公共布尔HandlerRequest(MessageContext MessageContext)引发WebServiceClientException{
System.out.println(“请求:+clientId”);
返回true;
}
@凌驾
公共布尔HandlerResponse(MessageContext MessageContext)引发WebServiceClientException{
System.out.println(“响应:+clientId”);
返回true;
}
@凌驾
公共布尔handleFault(MessageContext MessageContext)引发WebServiceClientException{
System.out.println(“错误:+clientId”);
返回true;
}
}
@组成部分
类CustomClient扩展了WebServiceGatewaySupport{
公共响应sendRequest(请求-请求,上下文){
CustomInterceptor[]拦截器={new CustomInterceptor(context.getClientId())};
设置拦截器(拦截器);
返回(响应)getWebServiceTemplate().MarshalSendReceive(请求);
}
}
@服务
@所需参数构造函数
类客户服务{
私人最终客户;
公共字符串调用(请求、上下文){
响应=customClient.sendRequest(请求,上下文);
返回response.getResult();
}
}
@RestController
@请求映射(“/test”)
@所需参数构造函数
类自定义控制器{
私人最终定制服务;
公共客户控制员(客户服务){
服务=服务;
}
@邮戳
公共字符串测试(@RequestBody客户端){
请求=新请求(client.getFirstName(),client.getLastName());
上下文=新上下文(client.getClientId());
returnservice.call(请求、上下文);
}
}

是否可以为每个调用实现具有某种状态的自定义拦截器?最好在
WebServicetemplate上没有任何锁,以避免性能下降。

好的。我已经为我的案子找到了解决办法。 我创建了一个
webservicesessagecallback
的实现,并使用它将每个请求的数据保存在
webservicesessage
的mime头中,而不是保存在拦截器中

@数据
类CustomMessageCallback实现WebServiceMessageCallback{
私有最终字符串clientId;
@凌驾
public void doWithMessage(WebServiceMessage消息)引发IOException、TransformerException{
MimeHeaders headers=((SaajSoapMessage)消息).getSaajMessage().getMimeHeaders();
headers.addHeader(“X-Client-Id”,clientId);
}
}
并在我的客户端实现中传递此回调:

@组件
类CustomClient扩展了WebServiceGatewaySupport{
公共响应sendRequest(请求-请求,上下文){
CustomInterceptor[]拦截器={new CustomInterceptor()};
设置拦截器(拦截器);
返回(响应)getWebServiceTemplate()
.marshalSendAndReceive(请求,新的CustomMessageCallback(context.getClientId());
}
}
所以现在我可以在通过拦截器处理请求/响应/错误时获取这些数据

@覆盖
公共布尔HandlerRequest(MessageContext MessageContext)引发WebServiceClientException{
字符串clientId=((SaajSoapMessage)messageContext.getRequest())
.getSaajMessage()文件
.getMimeHeaders()
.getHeader(“X-Client-Id”)[0];
System.out.println(“请求:+clientId”);
返回true;
}

您是否在侦听器注册表中添加了此侦听器?没有。当前实现工作正常,直到我同时发送两个或多个请求。
ClientInterceptorAdapter
这是
ClientInterceptor
的默认实现。我用它只是为了不在我的
CustomInterceptor
中保留空方法
afterCompletion
,在CustomClient中上下文和请求的导入是什么?对不起,我已经更新了代码示例,表明我不是从通过
WebServiceTemplate
发送的对象,而是从另一个名为
context
的对象保存数据到拦截器。因此,需要在拦截器中处理的数据没有进入
WebServiceTemplate
,我无法从
MessageContext
获取它。