Adicionar um filtro de servlet em um aplicativo Spring Boot

Eu gostaria de ter suporte a ETag . Para este propósito existe um ShallowEtagHeaderFilter que faz todo o trabalho. Como posso adicioná-lo sem declará-lo no meu web.xml (que na verdade não existe, porque de alguma forma eu passei sem isso até agora)?

PS Eu uso o Spring Boot 1.1.4

PPS Aqui está uma solução 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; } } 

Ao usar o Spring Boot

Como mencionado na documentação de referência , o único passo necessário é declarar esse filtro como um Bean em uma class de configuração, é isso!

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

Ao usar o Spring MVC

Você provavelmente já está estendendo um WebApplicationInitializer . Se não, então você deve converter sua configuração de webapp de um arquivo web.xml para uma class WebApplicationInitializer .

Se sua configuração de contexto residir em arquivo (s) XML, você poderá criar uma class que estenda o AbstractDispatcherServletInitializer – se estiver usando classs de configuração, o AbstractAnnotationConfigDispatcherServletInitializer será a escolha apropriada.

Em qualquer caso, você pode adicionar o registro do filtro:

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

Exemplos completos de boot do contêiner Servlet baseado em código estão disponíveis na documentação de referência do Spring .

Uma resposta um pouco atrasada.

Minha solução foi criar uma anotação 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 ""; } 

E então simplesmente aplique-o às implementações do 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()); } } 

Veja mais: @AliasFor , pergunta de annotations personalizadas do Spring

Intereting Posts