【问题标题】:How to define a default handler in Spring Boot 2如何在 Spring Boot 2 中定义默认处理程序
【发布时间】:2019-07-17 08:36:40
【问题描述】:

如何定义默认处理程序或控制器操作,当没有找到给定 URL 的其他处理程序时将调用它?

我尝试使用包罗万象的模式 /**(语法是 Kotlin):

@Controller
class DefaultController {

    @RequestMapping("/**")
    fun default(...) {
        ...
    }
}

但这与 Spring 自己的处理程序的优先级更高相匹配,例如 spring.mvc.static-path-pattern 中配置的静态文件路径不再可用。我需要我的默认处理程序具有最低优先级。

【问题讨论】:

    标签: java spring spring-boot kotlin request-mapping


    【解决方案1】:

    您必须添加 HandlerMapping 的实现并将其添加到处理程序列表中。您还需要指定处理请求的处理程序的顺序:

    @Bean
    public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
        SimpleUrlHandlerMapping simpleUrlHandlerMapping
          = new SimpleUrlHandlerMapping();
        Map<String, Object> urlMap = new HashMap<>();
        urlMap.put("/**", defaultController());
        simpleUrlHandlerMapping.setUrlMap(urlMap);
        simpleUrlHandlerMapping.setOrder(1);
        return simpleUrlHandlerMapping;
    }
    

    这里defaultController() 方法返回一个@Controller,这是您为给定映射定义的,所以DefaultControllersetOrder 方法定义了处理程序的优先级(顺序),从 0 开始。当然,一些默认的 HandlerMapping 也必须定义为 @Bean。有关此类配置的更多信息,您可以找到here

    编辑@Tobia 的一些想法:

    需要去掉@RequestMapping注解,使RequestMappingHandlerMapping不拾取控制器,并实现AbstractController接口覆盖handleRequestInternal()中控制器的定义。

    【讨论】:

    • 等等,我不确定它是否有效。我使用了setOrder(Ordered.LOWEST_PRECEDENCE) 而不是 1,但它仍然会覆盖资源处理程序。我需要在资源处理程序之后考虑它
    • 我使用的是 Spring Boot,所以有几个默认的处理程序。我只需要添加我的。我检查了应用程序bean(使用applicationContext.getBeansOfType(HandlerMapping.class),我可以看到我的加载了order = 2147483647,这是一个比order = 2147483646 resourceHandlerMapping更高的数字(更低的优先级)。那个是静态文件的默认SimpleUrlHandlerMapping,与/static/** 的明确 urlMap。但是每当我调用静态 URL 时,都会调用我的控制器。
    • 我想我知道发生了什么。我的控制器仍然被 requestMappingHandlerMapping 拾取,因为它仍然有 @RequestMapping 注释。但是如果我删除注释,我会得到javax.servlet.ServletException: No adapter for handler [...Controller@6da127ce]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
    • 所以我不得不删除@RequestMapping,实现AbstractController并覆盖handleRequestInternal()“旧方式”(Spring和Spring Boot对什么是“控制器”有不同的定义......)现在它可以工作了.感谢您的支持。
    • 该死的,这是一个相当不错的工作。老实说,我自己从来没有实现过它,我不知道它有这么多。
    猜你喜欢
    • 2020-11-27
    • 2016-06-04
    • 2023-03-04
    • 2020-01-20
    • 2012-10-07
    • 1970-01-01
    • 2016-03-06
    • 2018-08-20
    相关资源
    最近更新 更多