Was ist der richtige Weg, um HttpRequest-Interceptors in der Spring-Boot-Anwendung hinzuzufügen? Ich möchte Anfragen und Antworten für jede http-Anfrage protokollieren.
Die Spring Boot-Dokumentation behandelt dieses Thema überhaupt nicht. ( http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ )
Ich habe einige Webbeispiele gefunden, wie man dasselbe mit älteren Versionen von Spring macht, aber diese funktionieren mit applicationcontext.xml. Bitte helfen Sie.
java
spring
spring-mvc
spring-boot
riship89
quelle
quelle
HandlerInterceptor
erfolgreich implementiert . Es funktioniert gut. Das einzige Problem ist, dass einigeinternal HandlerInterceptor
eine Ausnahme auslösen, bevor sie von der behandelt werdencustom HandlerInterceptor
. DieafterCompletion()
überschriebene Methode wird aufgerufen, nachdem der Fehler von der internen Implementierung von HandlerInterceptor ausgelöst wurde. Haben Sie eine Lösung dafür?Antworten:
Da Sie Spring Boot verwenden, sollten Sie sich nach Möglichkeit lieber auf die automatische Konfiguration von Spring verlassen. Um zusätzliche benutzerdefinierte Konfigurationen wie Ihre Interceptors hinzuzufügen, geben Sie einfach eine Konfiguration oder Bean von an
WebMvcConfigurerAdapter
.Hier ist ein Beispiel für eine Konfigurationsklasse:
HINWEIS Sie annotieren dies nicht mit @EnableWebMvc, wenn Sie behalten möchten für mvc Frühling Boots - Autokonfiguration .
quelle
The type WebMvcConfigurerAdapter is deprecated
. Ich benutze Spring Web MVC 5.0.6WebMvcConfigurerAdapter
wird mit Spring 5 veraltet sein. Aus seinem Javadoc :Wie oben erwähnt, sollten Sie die Methode implementieren
WebMvcConfigurer
und überschreibenaddInterceptors
.quelle
MyCustomInterceptor
Gehen Sie wie folgt vor, um einer Spring Boot-Anwendung einen Interceptor hinzuzufügen
Erstellen Sie eine Interceptor-Klasse
Definieren Sie eine Konfigurationsklasse
Das ist es. Jetzt durchlaufen alle Ihre Anforderungen die unter der preHandle () -Methode von MyCustomInterceptor definierte Logik.
quelle
getReader() has already been called for this request
Fehler. Gibt es eine einfachere Möglichkeit, dies zu überwinden, ohne eine Kopie der tatsächlichen Anfrage zu verwenden?Advice
Da alle Antworten darauf den inzwischen längst veralteten abstrakten WebMvcConfigurer-Adapter anstelle des WebMvcInterface (wie bereits von @sebdooe erwähnt) verwenden, ist hier ein funktionierendes Minimalbeispiel für eine SpringBoot (2.1.4) -Anwendung mit einem Interceptor:
Minimal.java:
MinimalController.java:
Config.java:
MinimalInterceptor.java:
funktioniert wie angekündigt
Die Ausgabe gibt Ihnen etwas wie:
quelle
Ich hatte das gleiche Problem, dass WebMvcConfigurerAdapter veraltet war. Bei der Suche nach Beispielen habe ich kaum implementierten Code gefunden. Hier ist ein Teil des Arbeitscodes.
Erstellen Sie eine Klasse, die HandlerInterceptorAdapter erweitert
Implementieren Sie dann die WebMvcConfigurer-Schnittstelle
quelle
Sie können auch die Open-Source-SpringSandwich-Bibliothek verwenden, mit der Sie in Ihren Spring Boot-Controllern direkt angeben können, welche Interceptors angewendet werden sollen, ähnlich wie Sie Ihre URL-Routen mit Anmerkungen versehen.
Auf diese Weise schweben keine zu Tippfehlern neigenden Strings herum - SpringSandwichs Methoden- und Klassenanmerkungen überleben das Refactoring problemlos und machen deutlich, was wo angewendet wird. (Offenlegung: Ich bin der Autor).
http://springsandwich.com/
quelle
Im Folgenden finden Sie eine Implementierung, mit der ich jede HTTP-Anforderung abfange, bevor sie ausgeht, und die Antwort, die zurückkommt. Mit dieser Implementierung habe ich auch einen einzelnen Punkt, an dem ich einen beliebigen Header-Wert mit der Anforderung übergeben kann.
Unten ist die Rest Template Bean
quelle