SimpleUrlHandlerMapping的Java配置(Spring启动)

lma*_*gon 8 spring spring-boot

我有一个现有的Spring Web应用程序,它使用两个扩展AbstractController的控制器.我想将Spring Boot集成到应用程序中,以便我们可以将其作为独立应用程序运行.

我遇到了一个问题,因为Spring没有将调用转发给我的控制器.如何将控制器映射到"/ app/*"之类的URL模式?

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Application.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我启动应用程序时,我收到以下消息:

INFO  [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Mapped URL path [/index] onto handler 'myController'
Run Code Online (Sandbox Code Playgroud)

但是当我向/ 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
Run Code Online (Sandbox Code Playgroud)

And*_*son 15

SimpleUrlHandlerMappings是有序的,如javadoc中所述,默认值是Integer.MAX_VALUE指它们具有尽可能低的优先级.这会导致ResourceHttpRequestHandler(映射到默认情况下/**并具有Integer.MAX_VALUE - 1默认顺序)优先于控制器的映射.

更新您的sampleServletMapping()方法以将映射的顺序设置为小于的值Integer.MAX_VALUE - 1.例如:

@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;
}
Run Code Online (Sandbox Code Playgroud)