Java-Konfiguration von SimpleUrlHandlerMapping (Spring Boot)
-
21-12-2019 - |
Frage
Ich habe eine vorhandene Spring-Webanwendung, die zwei Controller verwendet, die AbstractController erweitern.Ich möchte Spring Boot in die Anwendung integrieren, damit wir es als eigenständige Anwendung ausführen können.
Ich stehe vor einem Problem, weil Spring die Anrufe nicht an meinen Controller weiterleitet.Wie kann ich den Controller einem URL-Muster wie „/app/*“ zuordnen?
SampleController.java
@Controller("myController")
public class SampleController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.getWriter().print("Hello world!");
return null;
}
}
Anwendung.java
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Bean
public SimpleUrlHandlerMapping sampleServletMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
Properties urlProperties = new Properties();
urlProperties.put("/index", "myController");
mapping.setMappings(urlProperties);
return mapping;
}
}
Wenn ich die Anwendung starte, erhalte ich folgende Meldung:
INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Mapped URL path [/index] onto handler 'myController'
Aber wenn ich eine Anfrage an /index sende, erhalte ich folgende Meldungen:
DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] Looking up handler method for path /index
DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] Did not find handler method for [/index]
DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Matching patterns for request [/index] are [/**]
DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] URI Template variables for request [/index] are {}
DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Mapping [/index] to HandlerExecutionChain with handler [org.springframework.web.servlet.resource.ResourceHttpRequestHandler@11195d3e] and 1 interceptor
Lösung
SimpleUrlHandlerMappings
werden bestellt und, wie im Javadoc beschrieben Die Standardeinstellung ist Integer.MAX_VALUE
Das bedeutet, dass sie die geringstmögliche Priorität haben.Dies bewirkt ResourceHttpRequestHandler
(was zugeordnet ist /**
und hat eine Reihenfolge von Integer.MAX_VALUE - 1
(standardmäßig) Vorrang vor der Zuordnung für Ihren Controller haben.
Aktualisieren Sie Ihre sampleServletMapping()
-Methode, um die Reihenfolge Ihres Mappings auf einen Wert festzulegen, der kleiner als ist Integer.MAX_VALUE - 1
.Zum Beispiel:
@Bean
public SimpleUrlHandlerMapping sampleServletMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(Integer.MAX_VALUE - 2);
Properties urlProperties = new Properties();
urlProperties.put("/index", "myController");
mapping.setMappings(urlProperties);
return mapping;
}