J'aimerais avoir ETag suport . A cet effet, il existe un ShallowEtagHeaderFilter
qui fait tout le travail. Comment puis-je l'ajouter sans le déclarer dans mon web.xml
(qui n'existe pas vraiment, parce que je m'en suis sorti jusqu'à présent)?
P.S. J'utilise Spring Boot 1.1.4
P.P.S. Voici une solution complète
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;
}
}
Comme mentionné dans la documentation de référence , la seule étape nécessaire est de déclarer ce filtre en tant que Bean dans une classe de configuration, c'est tout!
@Configuration
public class WebConfig {
@Bean
public Filter shallowEtagHeaderFilter() {
return new ShallowEtagHeaderFilter();
}
}
Vous étendez probablement déjà un WebApplicationInitializer
. Sinon, vous devez convertir votre configuration Webapp à partir d'un web.xml
fichier dans une classe WebApplicationInitializer
.
Si votre configuration de contexte réside dans des fichiers XML, vous pouvez créer une classe qui étend AbstractDispatcherServletInitializer
- si vous utilisez des classes de configuration, AbstractAnnotationConfigDispatcherServletInitializer
est le bon choix.
Dans tous les cas, vous pouvez ensuite ajouter l'enregistrement du filtre:
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new ShallowEtagHeaderFilter();
};
}
Exemples complets de l'initialisation du conteneur de servlet basée sur le code est disponible dans la documentation de référence de Spring .
Réponse un peu tardive.
Ma solution a été de créer des annotations personnalisées:
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 "";
}
Et puis appliquez-le simplement aux implémentations de filtre:
@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());
}
}
Voir plus: @AliasFor
, Question d'annotations personnalisées de printemps