`

cxf与Spring结合发布服务端与客户端以及拦截器配置与使用

    博客分类:
  • cxf
 
阅读更多

一、前言

其实网上有很多文章均说过CXF如何与Spring结合发布服务,以及如何构建测试客户端的话题。但纸上得来终觉浅,既然本次项目遇到了,且自己动手实践了,就做个记录。记录是最好的成长。且其中遇到了一些啼笑皆非的异常事件。

 

二、思路

实现正常的java接口以及实现类。业务实现逻辑暂且不表,这不是该文章的内容。

如下:

com.***.fax.facade.tomi.CallBackNotifyFacade

com.***.fax.facade.tomi.CallBackNotifyFacadeImpl

CallBackNotifyFacade上加入如下注解:@WebService

CallBackNotifyFacadeImpl上加入如下注解:

@WebService(endpointInterface = "com.qunar.fax.facade.tomi.CallBackNotifyFacade")

@Service("callBackNotifyFacadeImpl")

 

xml配置如下:

 

  <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

    <!-- http://localhost:8081/callBackNotifyFacade/callBackNotifyFacade?wsdl -->
    <jaxws:endpoint
            id="callBackNotifyFacade"
            implementor="com.***.fax.facade.tomi.CallBackNotifyFacadeImpl"
            address="/callBackNotifyFacade" >
      <jaxws:inInterceptors>
         <bean class="com.***.fax.facade.interceptor.CxfLoggingInInterceptor"/>
      </jaxws:inInterceptors>
      <jaxws:outInterceptors>
         <bean class="com.***.fax.facade.interceptor.CxfLoggingOutInterceptor" />
       </jaxws:outInterceptors>
    </jaxws:endpoint>

 其中CxfLoggingInInterceptor与CxfLoggingOutInterceptor分别为入口和出口拦截器。代码如下:

 

 

 

public class CxfLoggingInInterceptor extends AbstractLoggingInterceptor {

    private static final Logger LOG = LogUtils.getLogger(LoggingInInterceptor.class);

    public CxfLoggingInInterceptor() {
        super(Phase.RECEIVE);
    }

    @Override
    protected Logger getLogger() {
        return LOG;
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        // 日志增加唯一标识
        long startTime = SystemTimer.currentTimeMillis();
        NDC.push(startTime + "_" + Thread.currentThread().getId());
    }
}

 

 

   

public class CxfLoggingOutInterceptor extends AbstractLoggingInterceptor {

    private static final Logger LOG = LogUtils.getLogger(CxfLoggingOutInterceptor.class);

    public CxfLoggingOutInterceptor() {
        super(Phase.PRE_STREAM);
    }

    @Override
    protected Logger getLogger() {
        return LOG;
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        // 释放内存,清除标记
        NDC.pop();
        NDC.remove();
        NDC.clear();
    }
}

 

    pom.xml配置信息

   

<!-- cxf -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf</artifactId>
            <version>${cxf.version}</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>geronimo-javamail_1.4_spec</artifactId>
                    <groupId>org.apache.geronimo.specs</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>

  cxf.version 为  2.7.0

 

 

 

    服务端的代码就这些了。

 

三、客户端测试代码

 

 /**
     * 测试发送状态通知接口
     */
    @Test
    public void testSendFaxCallBack(){

        try{
            //生成动态客户端
            String wsdlUrl="fax/test/callback.wsdl";
            JaxWsDynamicClientFactory dynamicClient = JaxWsDynamicClientFactory.newInstance();
            Client client = dynamicClient.createClient(wsdlUrl);

            //设置超时时间
            HTTPConduit http = (HTTPConduit) client.getConduit();
            HTTPClientPolicy httpClientPolicy =  new  HTTPClientPolicy();
            httpClientPolicy.setConnectionTimeout( 36000 );
            httpClientPolicy.setAllowChunking( false );
            httpClientPolicy.setReceiveTimeout( 32000 );
            http.setClient(httpClientPolicy);

            //调用参数
            String xml="。。。。。";

            //调用,并返回结果
            Object[] res = client.invoke("sendCallBack", xml);
            System.out.println("response: " + res[0]);
        }catch (Exception e){
            logger.warn("",e);
        }
    }

 

 

四、开发过程出现的异常

1、异常信息如下:

 

HTTP

 Status 500 - Servlet.init() for servlet CXFServlet threw exception

type Exception report
message Servlet.init() for servlet CXFServlet threw exception
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet.init() for servlet CXFServlet threw exception
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)
root cause
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cxf' is defined
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:568)
	org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1099)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
	org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1121)
	org.apache.cxf.transport.servlet.CXFServlet.loadBus(CXFServlet.java:77)
	org.apache.cxf.transport.servlet.CXFNonSpringServlet.init(CXFNonSpringServlet.java:71)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

 

 

   原因,以下配置信息未引入生效:   

   

    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

 

 

2、异常信息如下:

Caused by: org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader.
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:70)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:96)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:65)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:429)

    原因:这个错误是最让我没有头绪的,因为一切配置正常,在本地测试也很正常,但是一上服务器就报错。

    查了很多的原因,更换了很多的版本,均无效,最后偶然发现在发布的脚本job里面,有一个checkurl,用来检查最终发布是否成功,被我写成了wsdl发布的url,结果造成ws服务未完全起来的时候,该url就会被不断重试。导致异常。

 

 

 

分享到:
评论

相关推荐

    spring集成cxf客户端和服务器端demo(含自定义拦截器)

    在本项目中,"spring集成cxf客户端和服务器端demo(含自定义拦截器)"是一个实战案例,展示了如何在Spring框架下与Apache CXF服务进行整合,实现客户端和服务端的交互,并利用拦截器来增强功能。以下是这个项目涉及的...

    CXF开发的服务端及客户端

    总之,"CXF开发的服务端及客户端"项目是一个全面展示CXF与Spring结合使用的技术实践,涵盖了服务端开发、客户端调用、文件传输和Spring框架的整合等多个重要知识点。通过学习和实践,开发者可以深入理解Web服务的...

    CXF&spring实例

    本文将详细探讨"CXF&spring实例"中的相关知识点,包括服务端和客户端的实现,以及如何结合Spring进行配置。 首先,让我们了解一下CXF。CXF是一个开源的Java框架,主要用于构建和开发Web服务。它支持多种Web服务标准...

    CXF WebService带有拦截器

    在CXF中,拦截器是处理消息生命周期中的关键组件,它们可以在消息发送前、接收后、发送后以及接收前执行自定义逻辑。这使得我们可以在不修改原有业务代码的情况下,轻松地添加额外的功能,如日志记录、安全检查或...

    CXF3.1.16 +Spring4 +MyBatis + Maven自定义拦截器 WebService实例源码下载

    【标题解析】 ...这个项目提供了从设计、实现到测试Web服务的完整示例,对于学习和理解CXF、Spring、MyBatis和Maven的集成,以及如何在Web服务中实现自定义拦截器和安全验证机制,具有很高的参考价值。

    CXF2.1.3+spring3.0+struts2.3.4

    Struts2.3.4版本包含了一些关键改进,如增强了拦截器的灵活性,提供了更多的插件支持,以及对最新Java和Web技术的兼容性。Struts2可以与CXF结合,通过Action跳转到不同的服务接口,从而提供动态的服务调用能力。 ...

    Cxf客户端及服务器端,实现客户端和服务器端的权限验证

    - 配置CXF服务端,添加安全拦截器,如WSS4JInInterceptor和WSS4JOutInterceptor,以处理进来的和发出的消息。 - 创建Realm并设置用户、角色和权限。这通常通过修改CXF的`jetty.xml`或`cxf.xml`配置文件完成。 - ...

    spring集成cxf客户端和服务器端demo

    例如,我们可以使用Spring Security来保护我们的Web服务,通过CXF的拦截器来处理异常和日志,还可以利用Spring的AOP(面向切面编程)来实现跨切面的关注点。 总之,“spring集成cxf客户端和服务器端demo”项目为...

    Apache CXF + Spring3 + REST + JSON配置

    以上是关于"Apache CXF + Spring3 + REST + JSON配置"的基本介绍,实际应用中可能涉及更多的细节和高级特性,如错误处理、分页、过滤器、拦截器等。在具体实践中,应结合项目需求灵活运用这些技术,以构建高效、可靠...

    Cxf拦截器实例

    例如,在Spring配置文件中,我们可以使用`&lt;cxf:client&gt;`或`&lt;cxf:endpoint&gt;`元素的`interceptor`属性来指定要使用的拦截器。 通过学习和理解这些示例,开发者可以更好地利用CXF拦截器来扩展和定制自己的Web服务,...

    cxf-spring

    9. **消息拦截器**:CXF允许使用Spring配置消息拦截器,这些拦截器可以在消息发送前或接收后执行特定操作,如性能监控、消息格式转换等。 10. **部署与运行**:集成后的项目可以被部署到Spring容器(如Tomcat、...

    apache-cxf结合spring示例

    9. **拦截器与处理器**:CXF允许自定义拦截器和处理器,以扩展服务功能,比如日志记录、性能监控、异常处理等。 10. **RESTful服务**:除了SOAP,CXF也支持RESTful风格的服务,使用JAX-RS标准,可以轻松地创建和...

    CXF 整合 Spring 搭建Web Service

    通过Spring AOP或CXF的拦截器,可以添加自定义的日志或监控逻辑。 9. **错误处理**: 通过Spring的异常翻译机制,可以将服务端的业务异常转换为Web服务标准的Fault响应,提供友好的错误信息给客户端。 通过以上...

    cxf例子,认证,登录,客户端

    在服务端,可以通过在Spring配置文件中定义拦截器或安全策略来实现这些机制。 3. **登录流程**:登录通常涉及用户输入凭据(如用户名和密码),然后通过HTTP请求发送到服务器进行验证。CXF可以通过自定义过滤器或...

    cxf 服务端搭建

    另外,通过CXF的拦截器和扩展点,可以自定义处理逻辑,满足更复杂的业务需求。 以上就是关于“CXF服务端搭建”的基础知识。通过阅读给出的博客链接,可以获取更详细的步骤和示例代码,帮助你更好地理解和实践这个...

    零配置spring 整合cxf、struts2

    我们可以通过Spring的`struts-plugin.xml`配置文件或者Struts2的`struts.xml`配置文件中的`&lt;interceptors&gt;`元素添加Spring拦截器,从而实现在Struts2动作类中注入Spring管理的bean。 在实际操作中,"CXFServer"可能...

    cxf所需jar包(内含配置文件)

    "cxf所需jar包(内含配置文件)"这个压缩包,正如其名,提供了SpringMVC与CXF整合所需的依赖库以及配置文件,使得开发者能够更方便地在Spring环境中集成CXF来处理Web服务。 首先,让我们详细了解一下CXF框架。CXF...

    彻底了解|利用Apache CXF框架开发WebService

    根据需求,我们可以使用四种类型的拦截器:客户端的出拦截器、客户端的入拦截器、服务端的出拦截器和服务端的入拦截器。通过这些拦截器,开发者可以监控和修改消息的传输过程,例如,添加日志记录,实现安全验证,或...

    cxf环境变量配置以及命令

    同时,基于拦截器(Interceptor)的架构使得 CXF 极具可扩展性,你可以自定义拦截器来处理特定的业务逻辑或日志记录。 ### 支持的协议和数据格式 - **传输协议**:CXF 支持 HTTP、HTTPS、JMS、CORBA 等多种传输...

Global site tag (gtag.js) - Google Analytics