no puede acceder a la primavera-nullpointerexception- autowired servicio (o DAO) anotada en una clase no-anotaciones

StackOverflow https://stackoverflow.com/questions/4289805

Pregunta

Tengo este problema que no pueda solucionar.

Desde mi @Controller, i puede acceder fácilmente a mi clase @Service autowired y jugar con él sin ningún problema. Pero cuando lo hago de una clase separada sin anotaciones, me da una NullPointerException.

Mi controlador (obras) -

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

Mi clase Java separado (no de trabajo) -

public final class UsersManagementUtil {
  @Autowired
  UserService userService;

o

@Autowired
UserDao userDao;

UserService o UserDAO son siempre nula! Sólo estaba tratando, si cualquiera de ellos funciona.

Mi configuración de escaneado componente tiene la raíz conjunto de paquetes de nivel para el escaneado por lo que debe 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?

¿Fue útil?

Solución

Desde Spring Referencia 3.0

  

Por defecto, las clases anotado con   @Component, @Repository, @Service,   @Controller, o una anotación personalizada   que sí se anota con   @Component se detectó el único   componentes candidatos.

UsersManagementUtil debe ser anotado con uno de ellos en función de su necesidad.

Otros consejos

inyección de dependencias El resorte funciona sólo en componentes administrados por la primavera. Si su UsersManagementUtil no está administrado por la primavera (es decir, no es un grano de primavera), @Autowired no funciona en su interior. Cualquiera de declarar como un grano de primavera (usando <bean> o anotación), o disparador autowiring manualmente después de la instanciación del objeto utilizando

applicationContext.getAutowireCapableBeanFactory().autowireBean(object);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top