2012-05-04 71 views
9

我正在寫一個RESTful服務(在JBoss上使用CXF),其中我使用Spring(Autowired)注入了另一個類。但是這個類沒有被注入並且是空的。Spring bean未注入CXF Web服務,爲什麼?

Web服務接口和類(注射哪裏需要發生)

package com.company.project.web; 

@Path("/myws") 
public interface IMyWebService {  
    @POST 
    @Path("/doSomething")  
    @Consumes("application/json") 
    @Produces("application/json") 
    MyResponse doSomething(MyRequest myRequest) 
} 

@Service("myWebService") 
public class MyWebService implements IMyWebService {  
    @Autowired 
    private IMyCore myCore; 

    public MyResponse doSomething(MyRequest myRequest) { 
     .... 
    } 
} 

這裏面有被注入

package com.company.project.biz; 

public interface IMyCore { 
    MyResponse doSomething(MyRequest myRequest); 
} 

@Component("myCore") 
public class MyCore implements IMyCore { 
    public MyResponse doSomething(MyRequest myRequest) { 
      ..... 
    } 
} 

的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:jaxws="http://cxf.apache.org/jaxws" 
    xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
    xmlns:context="http://www.springframework.org/schema/context" 
    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  
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

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

    <context:annotation-config /> 
    <context:component-scan base-package="com.company.project"/>  

    <jaxrs:server id="myWebService" address="/"> 
     <jaxrs:serviceBeans> 
      <bean class="com.company.project.web.MyWebService" /> 
     </jaxrs:serviceBeans> 
     <jaxrs:extensionMappings> 
      <entry key="json" value="application/json" /> 
     </jaxrs:extensionMappings> 
    </jaxrs:server> 
</beans> 

我的rvice是活動的(http://localhost:8080/{warname}/myws/doSomething),但MyCore實例沒有被注入MyWebService(在myCore字段中)。它始終爲空,我的服務無法按預期工作,而是拋出NullPointerException

嘗試通過Google收集的所有輸入。沒有運氣!非常感謝您的幫助。

問候

回答

1

嘗試在beans.xml中

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> 

添加下面的bean配置在我的情況下,它的工作..

+0

我嘗試這樣做,並沒有爲我工作。看起來,Web服務不是由Spring創建的,因此不是自動裝配的。 –

8

嘗試下面的方法添加到您的Web服務:

@PostConstruct 
public void init() { 
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
} 

當前的Web應用程序上下文(通常是由ContextLoaderListen加載的上下文呃)將用於自動裝配,所以IMyCore bean必須在上下文監聽器配置文件中定義,而不是在Web服務中定義。

+0

現在項目已經發生了一些變化,以嘗試您提出的解決方案。但我肯定會在代碼庫的本地副本上嘗試它,並借給你知道。感謝發佈! –

+0

這對我有效...謝謝! :d –

5

如果你想在CXF Web服務類使用Spring bean,然後將聲明的WebService作爲CXF的XML配置文件(如彈簧cxf.xml)

<bean id="hello" class="demo.spring.service.HelloWorldImpl" /> 
<jaxws:endpoint id="helloWorld" implementor="#hello" address="/HelloWorld" /> 

申報分離豆以下WebService類,然後使用ID將其放入端點中。像這樣,您將擁有Spring託管bean,您也可以在其中使用AutoWired註釋。

如果您將聲明您的Web服務如下,那麼您的bean永遠不會被自動注入。

<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="helloWorld" implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld"/> 

在這種情況下,你需要或者:

  • 注入Spring Bean手動

    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

  • 或檢索豆一個接一個從春天上下文

    ApplicationContext context = ...; // your Spring ApplicationContext HelloBean helloBean = (HelloBean) context.getBean("bean");

    我還沒有試過這個JAX-RS,但在我看來應該是相同的方法。

    From CXF official documentation.