У нас есть веб-сервис (jaxws), который вызывает другой веб-сервис (aslo jaxws). Конфигурация клиента JAXWS выглядит следующим образом -Связь между cxf-перехватчиками, слушателями и webservice (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>
Как вы можете видеть, у нас есть два перехватчиков и один слушатель ошибки. Мы хотим общаться между этими перехватчиками, прослушивателями ошибок и кодом веб-службы. Как указано в SO THREAD, мы использовали объект cxf Exchange для связи между веб-службой и перехватчиком.
Наш inFaultInterceptor код выглядеть следующим образом -
public class MyInFaultInterceptor extends AbstractPhaseInterceptor<Message> {
public MyInFaultInterceptor() {
super(Phase.RECEIVE);
}
public void handleMessage(Message message) {
message.getExchange().put("key", "value");
}
}
Out веб-сервис код выглядеть следующим образом -
public String addNumbers(int a, int b){
try{
myService.add(a,b);
}catch(MyServiceException e){
//Logging
}
Object value = PhaseInterceptorChain.getCurrentMessage().getExchange().get("key");
}
Но, внутр код веб-службы мы получаем null для данного «ключа», значит «ключ» отсутствует.
Есть ли способ, которым мы можем общаться между перехватчиками и веб-службами?
P.S: Мы можем общаться в пределах перехватчиков и слушателей с помощью вышеуказанного метода. То есть, мы можем получить доступ к набору ключей в outInterceptor in inFaultInterceptor, но ключи, установленные в любом перехватчике , или прослушиватель недоступен в веб-службе.
'PhaseInterceptorChain' использует' ThreadLocal' для хранения сообщение. Вероятно, Exchange Messsage расходуется и очищается после завершения цепочки перехватчиков, и вы не можете его восстановить с помощью 'PhaseInterceptorChain.getCurrentMessage()' – pedrofb