web-dev-qa-db-fra.com

Java config for spring interceptor where interceptor is using autowired spring beans

Je veux ajouter un intercepteur mvc à ressort dans le cadre de la configuration Java. J'ai déjà une configuration basée sur xml pour cela, mais j'essaie de passer à une configuration Java . Pour les intercepteurs, je sais que cela peut être fait comme ça à partir de la documentation du printemps-

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor());
    }

}

Mais mon intercepteur utilise un haricot à ressort câblé comme suit-

public class LocaleInterceptor extends HandlerInterceptorAdaptor {

    @Autowired
    ISomeService someService;

    ...
}

La classe SomeService ressemble à ceci:

@Service
public class SomeService implements ISomeService {

   ...
}

J'utilise des annotations comme @Service pour analyser les beans et ne les a pas spécifiés dans la classe de configuration comme @Bean

Si je comprends bien, puisque Java config utilise new pour créer l'objet, spring n'y injectera pas automatiquement les dépendances.

Comment puis-je ajouter des intercepteurs comme celui-ci dans le cadre de la configuration Java?

28
user3565529

Procédez simplement comme suit:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    LocaleInterceptor localInterceptor() {
         return new LocalInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeInterceptor());
    }

}

Bien sûr, LocaleInterceptor doit être configuré quelque part en tant que bean Spring (XML, Java Config ou en utilisant des annotations) pour que le champ correspondant de WebConfig soit injecté.

La documentation pour la personnalisation générale de la configuration MVC de Spring peut être trouvée ici , et spécifiquement pour les intercepteurs voir cette section

48
geoand

Lorsque vous gérez vous-même la création d'objet comme dans:

registry.addInterceptor(new LocaleInterceptor());

il n'y a aucun moyen que le conteneur Spring puisse gérer cet objet pour vous et donc effectuer l'injection nécessaire dans votre LocaleInterceptor.

Une autre façon qui pourrait être plus pratique pour votre situation est de déclarer le @Bean Géré dans le @Configuration Et d'utiliser la méthode directement, comme ceci:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public LocaleInterceptor localeInterceptor() {
        return new LocaleInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( localeInterceptor() );
    }
}
15
José Andias

Essayez d'injecter votre service en tant que paramètre constructeur. C'est simple.

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

   @Autowired
   ISomeService someService;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor(someService));
   }

}

Puis reconfigurez votre intercepteur,

public class LocaleInterceptor extends HandlerInterceptorAdaptor {


     private final ISomeService someService;

     public LocaleInterceptor(ISomeService someService) {
         this.someService = someService;
     }


}

À votre santé !

8
oko