我有一个现有的Spring Web应用程序,该应用程序使用两个扩展AbstractController的控制器。我想将Spring Boot集成到应用程序中,以便我们可以将其作为独立的应用程序运行。
我遇到了一个问题,因为Spring没有将调用转发给我的控制器。如何将控制器映射到URL模式(例如“ / app / *”)?
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; } }
应用程序
@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; } }
启动应用程序时,我收到以下消息:
INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Mapped URL path [/index] onto handler 'myController'
但是,当我向/ index发送请求时,收到以下消息:
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
SimpleUrlHandlerMappings是有序的,如javadoc中所述,默认值为Integer.MAX_VALUE,这意味着它们的优先级最低。这会导致ResourceHttpRequestHandler(默认情况下映射到/**并具有顺序Integer.MAX_VALUE - 1)优先于控制器的映射。
SimpleUrlHandlerMappings
Integer.MAX_VALUE
ResourceHttpRequestHandler
/**
Integer.MAX_VALUE - 1
更新您的sampleServletMapping()方法,以将映射顺序设置为小于的值Integer.MAX_VALUE - 1。例如:
sampleServletMapping()
@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; }