我想要ETag suport。为此目的,有一个ShallowEtagHeaderFilter
可以完成所有工作。如何在我web.xml
中没有声明它的情况下添加它(实际上它不存在,因为到目前为止我已经没过它了)?
P.S。我使用Spring Boot 1.1.4
P.P.S。这是一个完整的解决方案
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;
}
}
答案 0 :(得分:33)
作为mentioned in the reference documentation,唯一需要的步骤是在配置类中将过滤器声明为Bean,这就是它!
@Configuration
public class WebConfig {
@Bean
public Filter shallowEtagHeaderFilter() {
return new ShallowEtagHeaderFilter();
}
}
您可能已经扩展了WebApplicationInitializer
。如果没有,那么您应该将您的webapp配置从web.xml
文件转换为WebApplicationInitializer
类。
如果您的上下文配置存在于XML文件中,则可以创建扩展AbstractDispatcherServletInitializer
的类 - 如果使用配置类,则AbstractAnnotationConfigDispatcherServletInitializer
是正确的选择。
在任何情况下,您都可以添加过滤器注册:
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new ShallowEtagHeaderFilter();
};
}
code-based Servlet container initialization are available in the Spring reference documentation。
的完整示例答案 1 :(得分:2)
有点迟到的答案。
我的解决方案是创建自定义注释:
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 "";
}
然后将其应用于过滤器实现:
@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());
}
}