1. 程式人生 > >maven整合CXF WebService+Spring @Resource無法注入問題解決方法

maven整合CXF WebService+Spring @Resource無法注入問題解決方法

筆者是一個出道不長的小碼農.工作中需要用的maven 結合jetty容器進行開發的前提背景下

廢話不多說直接上程式碼

更改前的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>cxf</display-name>
    <!-- 配置spring框架 beans.xml -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:beans.xml</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:cxf-servlet.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- 配置cxf框架 cxf-servlet.xml -->
    <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <init-param>
            <param-name>config-location</param-name>
            <param-value>classpath:cxf-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/cxf/*</url-pattern>
    </servlet-mapping>
</web-app>
更改前的beans.xml(spring配置檔案)
<?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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 	
				http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
				http://www.springframework.org/schema/context 
				http://www.springframework.org/schema/context/spring-context-3.0.xsd
				http://www.springframework.org/schema/aop   
				http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
				http://www.springframework.org/schema/tx 
				http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
				http://www.springframework.org/schema/task  
                http://www.springframework.org/schema/task/spring-task-3.0.xsd">

         <context:annotation-config/>
         <context:component-scan base-package="com"/>
</beans>
更改前的 cxf-servlet.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" 
		xsi:schemaLocation=" http://www.springframework.org/schema/beans 
							http://www.springframework.org/schema/beans/spring-beans.xsd 
							http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    
    <!-- 載入提供的服務 -->
    <jaxws:endpoint id="helloService" address="/hi" implementor="cn.HelloService">
    	<!-- 配置攔截器 -->
    	<jaxws:inInterceptors>
    		<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
    	</jaxws:inInterceptors>
    	<jaxws:outInterceptors>
    		<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    	</jaxws:outInterceptors>
    </jaxws:endpoint>
</beans>

相信很多剛接觸webService cxf框架的小夥伴都是這麼配置的.在頁面訪問也是成功的.小白我也是這樣.單純的以為能出頁面就是大功告成了.

整合到專案中發現 @Resource 無法依賴注入.很是費解.因為已經 啟用spring註解<context:annotation-config/>和掃描包<context:component-scan base-package="com"/>但是依舊是 null

撈乾的直接上改後代碼+分析

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>cxf</display-name>
    <!-- 配置spring框架 beans.xml -->
    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>classpath:beans.xml</param-value>
    </context-param>
    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>classpath:cxf-servlet.xml</param-value>
    </context-param>
    <listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- 配置cxf框架 cxf-servlet.xml -->
    <servlet>
    	<servlet-name>cxf</servlet-name>
    	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    	<init-param>
    		<param-name>config-location</param-name>
    		<param-value>classpath:beans.xml</param-value>
    	</init-param>
    </servlet>
    <servlet-mapping>
    	<servlet-name>cxf</servlet-name>
    	<url-pattern>/cxf/*</url-pattern>
    </servlet-mapping>
</web-app>
beans.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:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc.xsd
	">
	
	<context:annotation-config/>
	<context:component-scan base-package="com"/>
        <import resource="cxf-servlet.xml" />


</beans>
cxf-servlet.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" 
		xsi:schemaLocation=" http://www.springframework.org/schema/beans 
							http://www.springframework.org/schema/beans/spring-beans.xsd 
							http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    
    <!-- 載入提供的服務 -->
    <jaxws:endpoint id="helloService" address="/hi" implementor="cn.HelloService">
    	<!-- 配置攔截器 -->
    	<jaxws:inInterceptors>
    		<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
    	</jaxws:inInterceptors>
    	<jaxws:outInterceptors>
    		<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    	</jaxws:outInterceptors>
    </jaxws:endpoint>
</beans>

更改內容分別在web.xml與beans.xml,未進行更改cxf-servlet.xml

更改之前是web.xml-->beans.xml

                web.xml-->cxf-servlet.xml

更改之後是web.xml-->beans.xml-->cxf-servlet.xml

更改之前兩個配置檔案相互獨立.啟動時載入beans.xml訪問加在cxf-servlet.xml.這個時候Spring的依賴注入並沒有啟動完全.且並沒有報錯.所以錯誤不是特別明顯

更改一下配置檔案的執行順序就能有效解決Spring @Resource註解無法注入的問題了