working springboot pointer not component annotation java spring spring-mvc interceptor

java - springboot - spring annotation configuration autowired



Configuración de Java para el interceptor de resorte donde el interceptor está usando beans de resorte autowired (3)

Quiero agregar Spring Mvc Interceptor como parte de la configuración de Java. Ya tengo una configuración basada en XML para esto, pero estoy tratando de pasar a una configuración de Java. Para los interceptores, sé que se puede hacer así a partir de la documentación de primavera.

@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LocaleInterceptor()); } }

Pero mi interceptor está usando un bean spring autowired en él como sigue:

public class LocaleInterceptor extends HandlerInterceptorAdaptor { @Autowired ISomeService someService; ... }

La clase SomeService se ve como sigue:

@Service public class SomeService implements ISomeService { ... }

Estoy usando anotaciones como @Service para escanear los beans y no los he especificado en la clase de configuración como @Bean

Según tengo entendido, dado que la configuración java usa nuevo para crear el objeto, Spring no inyectará automáticamente las dependencias en él.

¿Cómo puedo agregar los interceptores como este como parte de la configuración java?


Cuando manejas la creación de objetos por ti mismo como en:

registry.addInterceptor(new LocaleInterceptor());

no hay forma de que el contenedor Spring pueda administrar ese objeto por usted y, por lo tanto, realice la inyección necesaria en su LocaleInterceptor .

Otra forma que podría ser más conveniente para su situación, es declarar el @Bean administrado en la @Configuration y usar el método directamente, de esta manera:

@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean public LocaleInterceptor localeInterceptor() { return new LocaleInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor( localeInterceptor() ); } }


Solo haz lo siguiente:

@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean LocaleInterceptor localInterceptor() { return new LocalInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeInterceptor()); } }

Por supuesto, LocaleInterceptor debe configurarse como un bean Spring en algún lugar (XML, Java Config o usar anotaciones) para que el campo relevante de WebConfig se inyecte.

La documentación para la personalización general de la configuración MVC de Spring se puede encontrar here , y específicamente para Interceptores vea this sección


Trate de inyectar su servicio como un parámetro constructor. Es simple.

@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Autowired ISomeService someService; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LocaleInterceptor(someService)); } }

Luego reconfigure su interceptor,

public class LocaleInterceptor extends HandlerInterceptorAdaptor { private final ISomeService someService; public LocaleInterceptor(ISomeService someService) { this.someService = someService; } }

Saludos!