Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 如何覆盖cxf MessageSenderIndingInterceptor并控制handleMessage方法_Java_Web Services_Cxf - Fatal编程技术网

Java 如何覆盖cxf MessageSenderIndingInterceptor并控制handleMessage方法

Java 如何覆盖cxf MessageSenderIndingInterceptor并控制handleMessage方法,java,web-services,cxf,Java,Web Services,Cxf,我使用jaxws:client标记和spring来消费web服务。 在上面的过程中,我想在调用Web服务之前和之后使用cxf拦截器 我能够使用cxf拦截器,webservice返回正确的soap错误和成功响应,但在发生错误时不会调用inFaultInterceptor Http状态代码:404 而且当服务关闭时…连接异常 在分析了误差之后。。我发现异常正在从 /** *向Apache软件基金会(ASF)授权 *一个或多个参与者许可协议。见通知文件 *与此工作一起分发以获取更多信息 *关于版权所

我使用jaxws:client标记和spring来消费web服务。 在上面的过程中,我想在调用Web服务之前和之后使用cxf拦截器

我能够使用cxf拦截器,webservice返回正确的soap错误和成功响应,但在发生错误时不会调用inFaultInterceptor Http状态代码:404 而且当服务关闭时…连接异常

在分析了误差之后。。我发现异常正在从

/**
*向Apache软件基金会(ASF)授权
*一个或多个参与者许可协议。见通知文件
*与此工作一起分发以获取更多信息
*关于版权所有权。ASF许可此文件
*根据Apache许可证,版本2.0(
*“许可证”);除非符合规定,否则您不得使用此文件
*带着执照。您可以通过以下方式获得许可证副本:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*除非适用法律要求或书面同意,
*根据许可证分发的软件在
*“按原样”的基础上,没有任何
*种类,无论是明示的还是暗示的。请参阅许可证以获取详细信息
*管理权限和限制的特定语言
*根据许可证。
*/
包org.apache.cxf.interceptor;
导入java.io.IOException;
导入java.util.ResourceBundle;
导入org.apache.cxf.common.i18n.BundleUtils;
导入org.apache.cxf.message.Exchange;
导入org.apache.cxf.message.message;
导入org.apache.cxf.phase.AbstractPhaseInterceptor;
导入org.apache.cxf.phase.phase;
导入org.apache.cxf.transport.conductor;
/**
*从交换机获取管道并通过它发送消息。
*/
公共类MessageSenderInterceptor扩展了AbstractPhaseInterceptor{
私有静态最终ResourceBundle BUNDLE=BundleUtils.getBundle(MessageSenderInterceptor.class);
private MessageSenderEndingInterceptor end=new MessageSenderEndingInterceptor();
public MessageSenderInterceptor(){
超级(阶段准备发送);
}
公共无效handleMessage(消息消息){
试一试{
获取管道(消息)。准备(消息);
}捕获(IOEX异常){
抛出新错误(new org.apache.cxf.common.i18n.Message(“无法发送”,BUNDLE),例如);
}    
//添加最终拦截器以关闭导管
message.getInterceptorChain().add(结束);
}
公共类MessageSenderEndingInterceptor扩展了AbstractPhaseInterceptor{
public MessageSenderEndingInterceptor(){
超级(阶段准备、发送、结束);
}
public void handleMessage(消息消息消息)引发错误{
试一试{
getconductor(消息)。关闭(消息);
}捕获(IOE异常){
抛出新错误(neworg.apache.cxf.common.i18n.Message(“不能发送”,BUNDLE),e);
}
}
}
专用管道getconductor(消息){
Exchange=message.getExchange();
导管=exchange.getconductor(消息);
如果(导管==null
&&(exchange.getOutMessage()!=null
||exchange.getOutFaultMessage()!=null){
导管=OutgoingChainInterceptor.GetBackChannel导管(消息);
}
回流管;
}
}
我的问题:如何在我们的项目中重写这个类,以便定制内部类的handleMessage?
在抛出带有无法发送消息的cxf故障之前,我必须在故障侦听器中获得控制权…

您可以使用添加到cxf总线的故障侦听器。监听器还将捕获http异常(示例为404),允许您在将它们引发到调用方法之前执行代码

比如说

public class CxfFaultListenerImpl implements FaultListener{
    public boolean faultOccurred(final Exception exception,final String description,final Message message) {

        //return false to avoid standard CXF logging of exception
        return false;
    }
}
Spring CXF配置

<cxf:bus>
 <cxf:properties>
    <entry key="org.apache.cxf.logging.FaultListener">
        <bean id="cxfFaultListener" class="CxfFaultListenerImpl" />
    </entry>
 </cxf:properties>
</cxf:bus>

您可以使用添加到CXF总线的FaultListener。监听器还将捕获http异常(示例为404),允许您在将它们引发到调用方法之前执行代码

比如说

public class CxfFaultListenerImpl implements FaultListener{
    public boolean faultOccurred(final Exception exception,final String description,final Message message) {

        //return false to avoid standard CXF logging of exception
        return false;
    }
}
Spring CXF配置

<cxf:bus>
 <cxf:properties>
    <entry key="org.apache.cxf.logging.FaultListener">
        <bean id="cxfFaultListener" class="CxfFaultListenerImpl" />
    </entry>
 </cxf:properties>
</cxf:bus>


您不能使用故障拦截器捕获异常?感谢您的参与!我确实使用了错误拦截器,但在Web服务关闭的情况下,控件并没有这样做。控件仅在来自webservice的soap错误响应的情况下才进入handleMessage方法,但我想在webservice关闭的情况下将控件放入错误拦截器。从上面的message sender实现内置cxf interceptor引发异常您还想停止interceptor链,以便方法调用不会引发异常,或者只是知道interceptor中出现了问题?我想使用一些自定义框架将负载写入数据库,以便可以调用服务从esb恢复,我不介意运行拦截器链,但在Java.xml.ws.webserviceexceptionOk的情况下,我需要自定义拦截器中的控件,我认为在这种情况下可以使用FaultListener。请在回答中查看详细信息您不能使用故障拦截器捕获异常?感谢您的参与!我确实使用了错误拦截器,但在Web服务关闭的情况下,控件并没有这样做。控件仅在来自webservice的soap错误响应的情况下才进入handleMessage方法,但我想在webservice关闭的情况下将控件放入错误拦截器。从上面的message sender实现内置cxf interceptor引发异常您还想停止interceptor链,以便方法调用不会引发异常,或者只是知道interceptor中出现了问题?我想使用一些自定义框架将负载写入数据库,以便可以调用服务复述