2010-11-27 11 views
6

Tengo este problema que no puedo solucionar.spring-nullpointerexception- no puedo acceder al servicio anotado autowired (o dao) en una clase sin anotaciones

Desde mi @Controller, puedo acceder fácilmente a mi clase de autoconexión @Service y jugar con ella sin problema. Pero cuando hago eso desde una clase separada sin anotaciones, me da un NullPointerException.

Mi controlador (obras) -

@Controller 
public class UserController { 
@Autowired 
UserService userService;... 

Mi clase Java separada (no funciona) -

public final class UsersManagementUtil { 
    @Autowired 
    UserService userService; 

o

@Autowired 
UserDao userDao; 

UserService o UserDAO son siempre nula! Estaba intentando si alguno de ellos funciona.

Mi configuración de escaneo de componentes tiene el paquete de nivel raíz configurado para escanear, por lo que debería estar bien.

mi contexto servlet -

<?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" 
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/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 
<!-- the application context definition for the 
     springapp DispatcherServlet --> 
<!-- Enable annotation driven controllers, validation etc... --> 

<context:property-placeholder location="classpath:jdbc.properties" /> 
<context:component-scan base-package="x" /> 
<tx:annotation-driven transaction-manager="hibernateTransactionManager" /> 

    <!-- package shortended --> 
<bean id="messageSource" 
class="o.s.c.s.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="/WEB-INF/messages" /> 
</bean> 

<bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${database.driver}" /> 
    <property name="url" value="${database.url}" /> 
    <property name="username" value="${database.user}" /> 
    <property name="password" value="${database.password}" /> 
</bean> 

    <!-- package shortened --> 
<bean id="viewResolver" 
    class="o.s.w.s.v.InternalResourceViewResolver"> 

    <property name="prefix"> 
     <value>/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
    <property name="order"> 
     <value>0</value> 
    </property> 
</bean> 

     <!-- package shortened --> 
    <bean id="sessionFactory" 
     class="o.s.o.h3.a.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="annotatedClasses"> 
    <list> 
     <value>orion.core.models.Question</value> 
     <value>orion.core.models.User</value> 
     <value>orion.core.models.Space</value> 
     <value>orion.core.models.UserSkill</value> 
     <value>orion.core.models.Question</value> 
     <value>orion.core.models.Rating</value> 
    </list> 
    </property> 
     <property name="hibernateProperties"> 

     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
     </props> 
     </property> 
</bean> 

<bean id="hibernateTransactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

Alguna pista?

+0

posible duplicado de [¿Por qué es mi primavera @Autowired nula campo?] (Http: // stackoverflow .com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

Respuesta

6

De Spring Reference 3.0

Por defecto, clases anotados con @Component, @Repository, @Service, @Controller, o una anotación personalizada que sí se anota con @Component son los únicos componentes detectado candidatos.

UsersManagementUtil se deben marcar con una de ellas según su necesidad.

+0

esto es lo que entendí también pero no funcionaba para mí .. @Component se detecta pero el bean autowired sigue siendo nulo ... ningún error de lo contrario – user286806

+0

¿Qué pasa con UserService, es que la primavera es administrada? (anotado o definido en tu xml) –

4

La inyección de dependencia de resorte funciona solo en los componentes administrados por Spring. Si su UsersManagementUtil no está gestionado por Spring (es decir, no es un Spring Bean), @Autowired no funciona dentro de él. Ya sea la declara como un grano de primavera (usando <bean> o anotación), o desencadenar Autowiring manualmente después de la instanciación del objeto usando

applicationContext.getAutowireCapableBeanFactory().autowireBean(object); 
Cuestiones relacionadas