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?
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
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() );
}
}
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é !