2010-11-15 8 views
0

j'ai ce qui suit dans mon app-servlet.xmlressort @Inject d'annotation mvc ne fonctionne pas

<mvc:annotation-driven /> 

<context:component-scan base-package="com.merc.myProject.web.controllers"/> 
<context:component-scan base-package="com.merc.myProject.web.forms"/> 

ce que j'ai jamais dans mon paquet de commande obtient injecté, mais la même chose dans le paquet de formulaires est toujours nul .

ma forme ressemble à ce

public class SelectDatesForm { 

    @Inject IUserService userService; 
    ..... 
} 

mes contrôleurs ressemble à ceci

@Controller 
public class SelectDates { 

    @Inject IUserService userService; 

    ..... 
} 

quelqu'un s'il vous plaît aider

Répondre

1

Je suppose que votre SelectDatesForm est instancié manuellement avec new plutôt que d'être obtenu à partir du contexte Spring. Dans ce cas, ce n'est pas un haricot de printemps et donc pas un sujet pour l'injection de dépendance.

Habituellement, vous n'avez pas besoin d'injecter des dépendances dans les objets créés manuellement. Si vous avez réellement besoin de le faire, vous avez plusieurs options:

  • Déclarez votre SelectDatesForm comme un haricot scope prototype et obtenir une nouvelle instance de celui-ci à partir du contexte de printemps au lieu de créer avec new:

    @Component @Scope("prototype") 
    public class SelectDatesForm { ... } 
    

    et quand vous avez besoin d'obtenir une nouvelle instance de celui-ci:

    SelectDatesForm newForm = applicationContext.getBean(SelectDatesForm.class); 
    

    Cependant, ce couple d'approche de votre code avec le printemps de ApplicationContext.

  • Si votre ont aucun contrôle sur instanciation de SelectDatesForm (il se passe en dehors de votre code), vous pouvez utiliser @Configurable

  • vous pouvez également faciliter manuellement autowiring de l'objet créé avec new:

    SelectDatesForm newForm = new SelectDatesForm(); 
    applicationContext.getAutowireCapableBeanFactory().autowireBean(newForm); 
    
+0

Merci beaucoup pour toutes ces informations et les problèmes que vous avez pris pour expliquer. – user373201

4

<context:component-scan> cherche des classes annotées avec des choses comme @Component, @Controller, @Service, et ainsi de suite, et les configure comme des haricots. Si ces classes ont des propriétés injectées avec @Inject ou @Resource, elles seront également traitées.

Cependant, si votre classe n'est pas annotée pour commencer, alors @Inject ne sera pas traitée. C'est le cas pour SelectDatesForm. Si vous annotez ceci avec @Component, il devrait être ramassé. Je ferais toutefois un peu attention à ce sujet - les formes ne sont généralement pas de bons candidats pour les haricots de printemps, car ils ont tendance à être des objets éphémères jetables.

+0

Merci pour la réponse. J'ai essayé de mettre @Service ainsi que @Component. juste un à la fois, mais je reçois le même nullpointer excpetion. Parce que l'injection n'a pas eu lieu. – user373201