Interceptor für nicht existierende Request-Mapping mit Java-Konfiguration

9

Ich habe eine Konfigurationsklasse, die WebMvcConfigurationSupport erweitert und ich habe Interzeptoren wie folgt hinzugefügt:

%Vor%

wo myInterceptor() ist:

%Vor%

und es funktioniert gut für jedes Mapping ( /api/** ) das ich implementiert habe, zum Beispiel /api/sample - preHandle von MyInterceptor wird gefeuert (Ich habe einen Controller mit Mapping /api/sample ).

Wenn ich nicht vorhandene Ressource anrufe, wird zum Beispiel /api/forward/sample preHandle von MyInterceptor nie aufgerufen.

Bitte beachten Sie, dass es wie erwartet funktioniert hat, als ich die Konfiguration in xml hatte, wie:

%Vor%

Aus irgendeinem Grund werden bei java Konfigurationsanforderungen für nicht vorhandene Zuordnungen nicht abgefangen. Warum ist die Konfiguration nicht äquivalent? Ich dachte, es sollte sein.

BEARBEITEN:

Ein bisschen mehr Debugging-Informationen. Mit der XML-Konfiguration enthält DispatcherServlet#handlerMappings 5 Handler:

%Vor%

mit Java-Konfiguration enthält es 7 Handler:

%Vor%

Das Problem scheint mit SimpleUrlHandlerMapping zu sein (zumindest scheint es für die Ressource verwendet zu werden, die ich anrufe - api/forward/sample , während für api/sample RequestMappingHandlerMapping verwendet wird), die im Fall mit Java leere adopedIterceptors hat basierte Konfiguration.

EDIT 2:

Vollständiger Quellcode für die Beispielanwendung (Ich habe versucht, ihn so klein wie möglich zu machen, nur um den Effekt zu demonstrieren): Ссылка

In der Klasse ConfigurationBase - kann die Konfiguration von XML basierend auf Java basierend auf dem statischen Feld CONFIG umgeschaltet werden.

Mit XML-basierter Konfiguration funktionieren beide URLs:

%Vor%

Mit java based config forward funktioniert nicht.

    
maszter 08.04.2017, 16:08
quelle

1 Antwort

3

Ihre Frage bezieht sich auf eine "nicht vorhandene Anforderungszuordnung", aber in Ihrer XML-Konfiguration existiert sie:

<default-servlet-handler xmlns="http://www.springframework.org/schema/mvc" /> Dies deklariert einen Standard-Handler für alle Anfragen, und ein Anfrage-Interceptor funktioniert nur, wenn ein gültiger Handler gefunden wird. Entfernen Sie diese Zeile und Sie erhalten das gleiche Verhalten in der XML- und Java-Konfiguration: Es wird kein Standard-Handler gefunden und der Interceptor funktioniert nicht.

Damit der Interceptor alle Anforderungen in Ihrer Java-Konfiguration bearbeiten kann, müssen Sie einen Standard-Handler deklarieren. Sie könnten configureDefaultServletHandling überschreiben, aber afaik ist es nicht möglich, Interzeptoren darauf zu konfigurieren. Möglicherweise müssen Sie /** in einem Standard-Handling-Controller explizit zuordnen.

    
KeatsPeeks 24.04.2017, 12:13
quelle

Tags und Links