no puede acceder a la primavera-nullpointerexception- autowired servicio (o DAO) anotada en una clase no-anotaciones
-
28-09-2019 - |
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?
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);