2010-04-28 8 views
11

Возможно ли автообновление объекта в классе проверки? Я продолжаю получать null для объекта, который должен быть Autowired ...Как @Autowire объекты в классах Validator?

+0

Можете привести пример? – skaffman

+0

То же, что и мой проект. что еще более запутанно, так это то, что @Autowire работает над классами @Controller. проблема в том, что я создаю экземпляр класса AccessRequestValidator внутри Контроллера (vs установил его в XML-файле контекста). Я аннотировал Validator с @Component, но ни один из @Autowire не работает ... – wuntee

ответ

22

Являются ли ваши классы проверки включенной фасолью весны ??? Если нет, вы всегда получите null для своего объекта автоматически. Убедитесь, что вы включили свой класс проверки.

и включить аннотацию конфигурации боб постпроцессор не забывает (см < контекста: аннотация-конфигурация/> элемента)

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

Как включить свой класс Validation как управляемый Spring бин. Либо

1 ° Используя XML (как показано выше)

<beans ...> 
    <bean class="AccessRequestValidator"/> 
    <context:annotation-config /> 
</beans> 

2 ° Используя аннотацию вместо (Примечание @Component чуть выше класса)

@Component 
public class AccessRequestValidator implements Validator { 

} 

Но чтобы включить сканирование компонентов с помощью аннотаций Spring, вы должны: must включить обработчик bean-post (уведомление < контекст: компонент сканирования элемент)

<beans ...> 
    <context:annotation-config /> 
    <context:component-scan base-package="<PUT_RIGHT_HERE_WHICH_ROOT_PACKAGE_SHOULD_SPRING_LOOK_FOR_ANY_ANNOTATED_BEAN>"/> 
</beans> 

Внутри вашего контроллера, просто сделать это (Не используйте новый оператор)

Выберите одну из следующих стратегий

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; 
    } 

} 

ОБНОВЛЕНИЕ

Веб структура приложения должна выглядеть

<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 
       */ 

Ваш web.xml должен выглядеть (УВЕДОМЛЕНИЕ contextConfigLocation контекстных пары и 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> 

< Вашего SPRING-сервлет-NAME > -servlet .xml должен выглядеть (обратите внимание, что я использую Spring 2.5 - заменить, если вы используете 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

Я думаю, что он ссылается на классы проверки, которые * не * управляются Spring, и в этом случае 'annotation-config' не будет создавать разница. – skaffman

+0

Я не уверен, что вы подразумеваете под «управляемым/не управляемым весной» ... У меня есть класс, который реализует Validator и используется в контроллере как: \t \t AccessRequestValidator validator = new AccessRequestValidator(); validator.validate (accessRequestBean, result); – wuntee

+3

@wuntee У вас действительно нет управляемого брейком Spring. Если вы создаете какой-то экземпляр с помощью нового оператора, как Spring может управлять вашим экземпляром? Я покажу вам, как получить вашу цель. –

0

Пытаясь следовать тому, что вы показываете выше, я все еще получаю нулевой указатель:

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; 
... 
} 

бизнес-контекст.xml:

<bean id="userAccessCache" class="com.wuntee.taac.controller.UserAccessCache"> 
     <property name="cadaDao" ref="cadaDao" /> 
     <property name="adDao" ref="adDao" /> 
    </bean> 

Сканирует ли сканер сканирование дерева?

+0

Странно, я сейчас вижу то же самое в своем проекте. A @ Компонент-аннотированный валидатор с полем @Autowired, но он никогда не подключен и остается нулевым. – Haakon

+7

Обновление: Я нашел свою ошибку. В моем контроллере у меня был метод @InitBinder с этим кодом: binder.setValidator (новый FooValidator()); Так что, когда Spring управлял * a * FooValidator, я установил мой контроллер для использования другого неуправляемого. Я только что сменил его на автоподтвержденный FooValidator. – Haakon

Смежные вопросы