Ich habe eine Konfigurationsklasse, die WebMvcConfigurationSupport
erweitert und ich habe Interzeptoren wie folgt hinzugefügt:
wo myInterceptor()
ist:
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:
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.
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.
Tags und Links java spring-mvc spring-4