2010-04-28 12 views
11

¿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?

+0

¿Puedes dar un ejemplo? – skaffman

+0

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

Respuesta

22

¿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> 
+0

Creo que se está refiriendo a las clases de validador * no * administradas por Spring, en cuyo caso 'annotation-config' no hará una diferencia. – skaffman

+0

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

+3

@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 –

0

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?

+0

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

+7

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