WebService之CXF、Spring web整合发布REST风格的服务(报错)

在上一篇博客 WebService之CXF发布REST风格的服务讲述了REST风格,并且演示如何发布一个REST风格的服务,在此篇博客将演示将CXF与Spring web整合,让spring负责发布REST风格的服务。

1、创建一个java web服务

在这里插入图片描述
在这里插入图片描述

2、导入CXF、Spring的jar包

①、在WEB-INF目录下创建lib文件夹
在这里插入图片描述
在这里插入图片描述
②、导入CXF的jar包
在这里插入图片描述
③、导入Spring的jar包
\color{red}注意: 由于CXF的jar包中已经包含众多Spring的jar包,所以只要导入spring包中的springmvc包。(如果你的CXF没有包含spring的jar,你需要手动导入)
在这里插入图片描述
在这里插入图片描述
④、将WEB-INF/lib设置为项目Library
在这里插入图片描述
在这里插入图片描述
⑤、检查Project Structure是否有problem
在这里插入图片描述

3、编写Student模型、服务接口、实现类

请参考WebService之CXF发布REST风格的服务第二段的3、4步。

在这里插入图片描述

4、编写Spring配置文件

在src根目录下创建文件applicationContext.xml
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
       xmlns:cxf="http://cxf.apache.org/core"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
				            http://www.springframework.org/schema/beans/spring-beans.xsd
				            http://cxf.apache.org/jaxrs
				            http://cxf.apache.org/schemas/jaxrs.xsd
				            http://cxf.apache.org/jaxws
				            http://cxf.apache.org/schemas/jaxws.xsd
				            http://cxf.apache.org/core
				            http://cxf.apache.org/schemas/core.xsd">

    <!--1.配置个服务接口实现类  -->
    <bean id="studentServiceImpl" class="cn.hestyle.service.StudentServiceImpl"/>
    <!--2.配置cxf服务工厂bean,REST风格  -->
    <jaxrs:server address="/student" serviceClass="cn.hestyle.service.StudentService">
        <jaxrs:serviceBeans>
            <ref bean="studentServiceImpl"/>
        </jaxrs:serviceBeans>
    </jaxrs:server>
</beans>

5、配置web.xml文件加载spring配置文件以及CXF请求拦截

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    <!--1、配置contextConfigLocation,即spring配置文件applicationContext.xml的路径  -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 2.配置CXF拦截 -->
    <servlet>
        <servlet-name>CXF</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXF</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

6、启动tomcat web容器,在浏览器访问配置的服务

在这里插入图片描述

但是报错了,目测是web.xml里CXF拦截器出了问题,百度、谷歌了好几个小时也没解决。

11-Dec-2019 14:26:54.647 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Error during ServletContainerInitializer processing
	javax.servlet.ServletException: Servlet with a name javax.ws.rs.core.Application is not available
		at org.apache.cxf.jaxrs.servlet.sci.JaxrsServletContainerInitializer.getServletMapping(JaxrsServletContainerInitializer.java:147)
		at org.apache.cxf.jaxrs.servlet.sci.JaxrsServletContainerInitializer.onStartup(JaxrsServletContainerInitializer.java:104)
		at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5135)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
		at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
		at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
		at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1728)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
		at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
		at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
		at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
		at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
		at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
		at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
		at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
		at java.security.AccessController.doPrivileged(Native Method)
		at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
		at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
		at sun.rmi.transport.Transport$1.run(Transport.java:200)
		at sun.rmi.transport.Transport$1.run(Transport.java:197)
		at java.security.AccessController.doPrivileged(Native Method)
		at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
		at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
		at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
		at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
		at java.security.AccessController.doPrivileged(Native Method)
		at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
		at java.lang.Thread.run(Thread.java:748)

经过反复检查StudentService、spring配置文件,web.xml,都没有找到哪里出问题。。。路过的可以指点一下啊

发布了976 篇原创文章 · 获赞 230 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/103488153