¿Es posible realizar un autoenvío de un objeto en una clase de validación? Sigo obteniendo nulo para el objeto que se supone que es Autowired ...Cómo usar objetos @Autowire en las clases de Validator?
Respuesta
¿Su clase de validación es habilitada Spring bean ??? Si no, siempre obtendrás un valor nulo para que tu objeto esté autoconectado. Asegúrese de haber habilitado su clase de Validación.
Y no se olvide de permitir que el grano de configuración de anotación post-procesador (consulte < contexto: anotación-config/> elemento)
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
</beans>
Cómo habilitar su clase de Validación como un grano de primavera administrado. De cualquier
1 ° Mediante el uso de XML (Como se muestra arriba)
<beans ...>
<bean class="AccessRequestValidator"/>
<context:annotation-config />
</beans>
2 ° Mediante el uso de la anotación en lugar (Aviso @Component justo por encima de la clase)
@Component
public class AccessRequestValidator implements Validator {
}
Pero para habilitar el escaneo de componentes anotados por Spring, usted debe habilitar un procesador de publicación de beans (aviso < contexto: elemento componente de exploración)
<beans ...>
<context:annotation-config />
<context:component-scan base-package="<PUT_RIGHT_HERE_WHICH_ROOT_PACKAGE_SHOULD_SPRING_LOOK_FOR_ANY_ANNOTATED_BEAN>"/>
</beans>
Dentro de su controlador, sólo lo hacen (No utilice nuevo operador)
Elija una de las siguientes estrategias
public class MyController implements Controller {
/**
* You can use FIELD @Autowired
*/
@Autowired
private AccessRequestValidator accessRequestValidator;
/**
* You can use PROPERTY @Autowired
*/
private AccessRequestValidator accessRequestValidator;
private @Autowired void setAccessRequestValidator(AccessRequestValidator accessRequestValidator) {
this.accessRequestValidator = accessRequestValidator;
}
/**
* You can use CONSTRUCTOR @Autowired
*/
private AccessRequestValidator accessRequestValidator;
@Autowired
public MyController(AccessRequestValidator accessRequestValidator) {
this.accessRequestValidator = accessRequestValidator;
}
}
ACTUALIZACIÓN
Su estructura de aplicación web debería parecerse
<CONTEXT-NAME>/
WEB-INF/
web.xml
<SPRING-SERVLET-NAME>-servlet.xml
business-context.xml
classes/
/com
/wuntee
/taac
/validator
AccessRequestValidator.class
lib/
/**
* libraries needed by your project goes here
*/
Su Web.xml debería parecerse (AVISO contextConfigLocation context-param y ContextLoaderListener)
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<!--If your business-context.xml lives in the root of classpath-->
<!--replace by classpath:business-context.xml-->
<param-value>
/WEB-INF/business-context.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name><SPRING-SERVLET-NAME></servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name><SPRING-SERVLET-NAME></servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>
Su < SPRING-servlet-NOMBRE > -servlet .xml debería verse así (Tenga en cuenta que estoy usando Spring 2.5 - reemplace si está usando 3.0)
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!--ANY HANDLER MAPPING-->
<!--ANY VIEW RESOLVER-->
<context:component-scan base-package="com.wuntee.taac"/>
<context:annotation-config/>
</beans>
Creo que se está refiriendo a las clases de validador * no * administradas por Spring, en cuyo caso 'annotation-config' no hará una diferencia. – skaffman
No estoy seguro de lo que quiere decir con 'administrado/no administrado por primavera' ... tengo una clase que implementa Validator y se utiliza en el controlador como: \t \t AccessRequestValidator validator = new AccessRequestValidator(); validator.validate (accessRequestBean, result); – wuntee
@wuntee Realmente no tienes un frijol administrado por Spring. Si crea alguna instancia utilizando un nuevo operador, ¿cómo puede Spring administrar su instancia? Le mostraré cómo conseguir su objetivo –
Tratando de seguir lo que muestran más arriba, todavía estoy recibiendo un puntero nulo:
context.xml:
<context:annotation-config />
<context:component-scan base-package="com.wuntee.taac"/>
AccessRequestValidator.java
package com.wuntee.taac.validator;
@Component
public class AccessRequestValidator implements Validator {
@Autowired
private UserAccessCache userAccessCache;
...
}
negocio-contexto.xml:
<bean id="userAccessCache" class="com.wuntee.taac.controller.UserAccessCache">
<property name="cadaDao" ref="cadaDao" />
<property name="adDao" ref="adDao" />
</bean>
¿El escáner explora recursivamente el árbol?
Extraño, ahora estoy viendo lo mismo en mi proyecto. Un Validador anotado por componente @ con un campo @Autowired, pero nunca está cableado y permanece nulo. – Haakon
Actualización: Encontré mi error. En mi controlador, tenía un método @InitBinder con este código: binder.setValidator (nuevo FooValidator()); Entonces, mientras Spring administraba * a * FooValidator, configuré mi controlador para usar uno diferente, no administrado. Lo cambié a un FooValidator autocableado. – Haakon
- 1. Cómo usar @autowire en beans administrados jsf
- 2. Cómo hacer una referencia cruzada de objetos en las clases
- 3. Cómo Autowire factorybean
- 4. ¿Las clases de Java son objetos?
- 5. Cómo usar las clases PrintServer y PrintQueue
- 6. ¿Cómo usar las clases de fábrica con linq para sql?
- 7. Usar correctamente las clases en otras clases en php?
- 8. Creación de instancias de objetos en las clases de prueba
- 9. Cuándo usar las clases en C#?
- 10. ¿Cómo asignar los objetos JSON a las clases Objective C?
- 11. ¿Cómo puedo usar SimpleFormController con Validator con Spring 3?
- 12. java cómo usar las clases en otro paquete?
- 13. ¿Cómo usar las clases PrintWriter y File en Java?
- 14. Spring autowire a list
- 15. Autowire dependiendo de la subclase
- 16. Alcance en JSF Validator
- 17. ¿Cómo usar las clases de cliente webservice generadas con Eclipse?
- 18. NamedParameterJdbcDaoSupport datasource autowire?
- 19. @Autowire modo predeterminado
- 20. ¿Cómo obtener detalles del error de JAXB Validator?
- 21. ¿Cómo saber qué hace exactamente Spring autowire?
- 22. cómo usar log4j con múltiples clases?
- 23. @Autowire extraño problema
- 24. Primavera + Hibernate, Autowire sessionFactory en DAO
- 25. JQuery URL Validator
- 26. ¿Cómo usar las estructuras C que contiene objetos ObjC?
- 27. .NET 4 RTM MetadataType atributo ignorado al usar Validator
- 28. ¿Cómo uso las clases internas en PHP?
- 29. jQuery Validator Desvinculación
- 30. Usar clases internas en C#
¿Puedes dar un ejemplo? – skaffman
Eso es idéntico a cómo se presenta mi proyecto. lo que es aún más confuso es que @Autowire está trabajando en las clases @Controller. el problema es que estoy creando una instancia de la clase AccessRequestValidator dentro de un Controlador (frente a la configuración en un archivo xml de contexto). He anotado el Validator con @Component, pero ninguno de los @Autowire está trabajando ... – wuntee