Agregar un filtro de servlet en una aplicación Spring Boot

Me gustaría tener soporte de ETag . Para este propósito hay un ShallowEtagHeaderFilter que hace todo el trabajo. ¿Cómo puedo agregarlo sin declararlo en mi web.xml (que en realidad no existe, porque de alguna manera me las arreglé hasta el momento)?

PD: uso Spring Boot 1.1.4

PPS Aquí hay una solución completa

 package cuenation.api; import org.springframework.boot.context.embedded.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.ShallowEtagHeaderFilter; import javax.servlet.DispatcherType; import java.util.EnumSet; @Configuration public class WebConfig { @Bean public FilterRegistrationBean shallowEtagHeaderFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new ShallowEtagHeaderFilter()); registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); registration.addUrlPatterns("/cue-categories"); return registration; } } 

Cuando se usa Spring Boot

Como se menciona en la documentación de referencia , el único paso necesario es declarar ese filtro como un Bean en una clase de configuración, ¡eso es todo!

 @Configuration public class WebConfig { @Bean public Filter shallowEtagHeaderFilter() { return new ShallowEtagHeaderFilter(); } } 

Cuando se usa Spring MVC

Probablemente ya esté extendiendo un WebApplicationInitializer . De lo contrario, conviene convertir la configuración de su aplicación web de un archivo web.xml a una clase WebApplicationInitializer .

Si su configuración de contexto vive en archivos XML, puede crear una clase que extienda AbstractDispatcherServletInitializer ; si usa clases de configuración, AbstractAnnotationConfigDispatcherServletInitializer es la elección correcta.

En cualquier caso, puede agregar el registro de filtro:

  @Override protected Filter[] getServletFilters() { return new Filter[] { new ShallowEtagHeaderFilter(); }; } 

Los ejemplos completos de inicialización del contenedor de servlets basados ​​en código están disponibles en la documentación de referencia de Spring .

Un poco tarde de respuesta.

Mi solución fue crear una anotación personalizada:

 import org.springframework.core.annotation.AliasFor; import org.springframework.stereotype.Component; // ... @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Component public @interface Filter { @AliasFor(annotation = Component.class, attribute = "value") String value() default ""; } 

Y luego simplemente aplicarlo a las implementaciones de filtro:

 @Filter public class CustomFilter extends AbstractRequestLoggingFilter { @Override protected void beforeRequest(HttpServletRequest request, String message) { logger.debug("before req params:", request.getParameterMap()); } @Override protected void afterRequest(HttpServletRequest request, String message) { logger.debug("after req params:", request.getParameterMap()); } } 

Ver más: @AliasFor , Spring pregunta de anotaciones personalizadas