我们有调用另一个Web服务的web服务(jaxws)(aslo jaxws)。 Jaxws客户端配置如下所示 -
<jaxws:client id="helloClient"
serviceClass="demo.spring.HelloWorld"
address="http://localhost:9002/HelloWorld" >
<jaxws:outInterceptors>
<bean class="com.company.MyOutInterceptor"/>
</jaxws:outInterceptors>
<jaxws:inFaultInterceptors>
<bean class="com.company.MyInFaultInterceptor"/>
</jaxws:inFaultInterceptors>
<cxf:properties>
<entry key="org.apache.cxf.logging.FaultListener">
<bean class="com.company.MyFaultListener"/>
</entry>
</cxf:properties>
</jaxws:client>
如你所见,我们有两个拦截器和一个故障监听器。我们希望在这些拦截器,故障监听器和Web服务代码之间进行通信。 如SO THREAD中所述,我们使用cxf Exchange对象进行Web服务和拦截器之间的通信。
我们的inFaultInterceptor代码如下所示 -
public class MyInFaultInterceptor extends AbstractPhaseInterceptor<Message> {
public MyInFaultInterceptor() {
super(Phase.RECEIVE);
}
public void handleMessage(Message message) {
message.getExchange().put("key", "value");
}
}
Web服务代码如下所示 -
public String addNumbers(int a, int b){
try{
myService.add(a,b);
}catch(MyServiceException e){
//Logging
}
Object value = PhaseInterceptorChain.getCurrentMessage().getExchange().get("key");
}
但是,在Web服务代码中,对于给定的&#34; key&#34;,我们将为null,表示&#34; key&#34;不在场。
我们有什么办法可以在拦截器之间进行通信 网络服务?
P.S :我们可以使用上述方法在拦截器和听众中进行通信。也就是说,我们可以访问密钥集 inFaultInterceptor中的outInterceptor,但在任何拦截器中设置了键 或者在Web服务中无法访问监听器。
答案 0 :(得分:1)
不确定构建机制中是否有任何Cxf,我使用ThreadLocal
在webservice方法和拦截器之间传递信息,
public final class KPContextHolder {
private static ThreadLocal<String> myKey = new ThreadLocal<>();
private KPContextHolder() {
}
public static String getMyKey() {
return myKey.get();
}
public static void setMyKey(final String input) {
myKey.set(input);
}
/**
* Clear all the fields saved in the thread context
*/
public static void clear() {
myKey.remove();
}
}
拦截器类
public class MyInFaultInterceptor extends AbstractPhaseInterceptor<Message> {
public MyInFaultInterceptor() {
super(Phase.RECEIVE);
}
public void handleMessage(Message message) {
KPContextHolder.setMyKey("value");
}
}
和WebService方法。
public String addNumbers(int a, int b){
try{
myService.add(a,b);
}catch(MyServiceException e){
//Logging
}
String value = KPContextHolder.getMyKey();
}
注意:强>