2012-05-04 19 views
9

Estoy escribiendo un servicio RESTful (usando CXF en JBoss) en el que he inyectado otra clase usando Spring (Autowired). Pero la clase no se inyecta y es nula.Spring Bean no inyectado en el servicio web CXF, ¿Por qué?

interfaz de servicios Web y clase (¿Dónde inyección tiene que suceder)

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) { 
     .... 
    } 
} 

Lo que tiene que ser inyectado

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> 

Mi se rvice está activo (http://localhost:8080/{warname}/myws/doSomething) pero la instancia MyCore no se está inyectando en MyWebService (en el campo myCore). Siempre es nulo y mi servicio no funciona como se esperaba, en su lugar lanza NullPointerException

Intenté todas las entradas recopiladas en google. ¡Sin suerte! Tu ayuda es altamente apreciada.

Saludos

Respuesta

1

intenta agregar a continuación la configuración del grano al beans.xml

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

En mi caso, funcionó ..

+0

He intentado esto y no funciona para mí. Parece que el servicio web no es creado por Spring y, por lo tanto, no se está autoconectando. –

8

intenta agregar a continuación el método para su servicio web:

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

El contexto actual de la aplicación web (generalmente el que carga ContextLoaderListen er) se utilizará para el autoenvío, por lo que el bean de IMyCore se debe definir en el archivo de configuración del oyente de contexto y no en el del servicio web.

+0

En este momento, el proyecto ha cambiado un poco para probar la solución que ha sugerido. Pero definitivamente lo intento en una copia local de la base de códigos y se lo presto. ¡Gracias por publicar! –

+0

Esto funcionó para mí ... ¡Gracias! :RE –

5

Si desea utilizar las habas de primavera en la clase de servicio Web CXF, a continuación, se declaran como servicio Web siguiente en el archivo de configuración XML de la CXF (por ejemplo cxf.xml-primavera)

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

Declarar frijol separado para el Clase WebService y luego colocarlo en el punto final con una ID. De esta manera, tendrás bean administrado por Spring, donde también podrás usar anotaciones AutoWired.

Sus granos nunca se inyectarán automáticamente si declara que su servicio web es el siguiente.

<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"/> 

En este caso, tendrá que o bien:

  • granos de primavera Inyectar manualmente

    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

  • o recuperar los granos uno a uno de la primavera contexto

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

    No he probado esto para JAX-RS, pero el enfoque en mi opinión debería ser el mismo.

    From CXF official documentation.

Cuestiones relacionadas