Printemps de haricots pas injecté dans CXF service web, Pourquoi?
Je suis en train d'écrire un service RESTful (à l'aide de CXF sur JBoss) dans lequel j'ai injecter une autre classe à l'aide de Printemps (Autocâblés). Mais la classe n'est pas l'injection est null.
Interface de Service Web et de Classe (Où l'injection doit se produire)
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) {
....
}
}
Ce qui doit être injecté
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>
Mon service est actif (http://localhost:8080/{warname}/myws/doSomething) mais le MyCore instance n'est pas d'être injecté dans MyWebService (dans le myCore champ). Il est toujours nulle et mon service ne fonctionne pas comme prévu, au lieu de cela jette NullPointerException
Essayé toutes les contributions recueillies sur google. Pas de chance! Votre aide est très appréciée.
Ce qui concerne
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter ci-dessous la méthode de votre service web:
L'actuel contexte d'application web (généralement le chargé par ContextLoaderListener) sera utilisé pour permettra à l'autowiring, de sorte que le IMyCore bean doit être définie dans le contexte de l'écouteur de fichier de configuration et non pas dans le web service.
Si vous souhaitez utiliser des Beans Spring dans CXF classe de Service Web, puis de déclarer WebService comme suit dans le fichier de configuration XML de la CXF (par ex. spring-cxf.xml)
Déclarer séparés bean pour la classe de Service web, puis le mettre dans le point de terminaison avec un ID. Comme cela, vous aurez printemps managed bean, où vous pouvez utiliser Autocâblés annotations en tant que bien.
Vos haricots jamais de ne pas être injecté automatiquement si vous ne déclarez que votre service web de la manière suivante.
Dans ce cas, vous aurez besoin:
Injecter des beans spring manuellement
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
Ou de récupérer les grains un par un à partir du printemps contexte
ApplicationContext context = ...; //your Spring ApplicationContext
HelloBean helloBean = (HelloBean) context.getBean("bean");
Je n'ai pas essayé ce pour JAX-RS, mais l'approche, à mon avis, devrait être le même.
De CXF la documentation officielle.
Essayez d'ajouter ci-dessous les haricots de configuration à Beans.xml
Dans mon cas, cela a fonctionné..