Java 如何在SpringBoot2中定义默认处理程序
如何定义一个默认处理程序或控制器操作,当没有为给定URL找到其他处理程序时,将调用该处理程序或控制器操作 我尝试使用一个catch-all模式Java 如何在SpringBoot2中定义默认处理程序,java,spring,spring-boot,kotlin,request-mapping,Java,Spring,Spring Boot,Kotlin,Request Mapping,如何定义一个默认处理程序或控制器操作,当没有为给定URL找到其他处理程序时,将调用该处理程序或控制器操作 我尝试使用一个catch-all模式/**(语法为Kotlin): 但是这与Spring自己的处理程序的优先级相匹配,例如,在Spring.mvc.static path模式中配置的静态文件路径不再可用。我需要我的默认处理程序具有最低优先级。您必须添加HandlerMapping的实现,并将其添加到处理程序列表中。您还需要指定处理请求的处理程序的顺序: @Bean public Simple
/**
(语法为Kotlin):
但是这与Spring自己的处理程序的优先级相匹配,例如,在
Spring.mvc.static path模式中配置的静态文件路径不再可用。我需要我的默认处理程序具有最低优先级。您必须添加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;
}
@Bean
公共simplerlhandlermapping simplerlhandlermapping(){
SimpleUrlHandlerMapping SimpleUrlHandlerMapping
=新的SimpleUrlHandlerMapping();
Map urlMap=newhashmap();
put(“/**”,defaultController());
simplerlhandlermapping.setUrlMap(urlMap);
simpleUrlHandlerMapping.setOrder(1);
返回simplerlhandermapping;
}
这里的defaultController()
方法返回一个您为给定映射定义的@Controller
,因此defaultController
。setOrder
方法定义处理程序的优先级(顺序),从0开始。当然,一些默认的HandlerMapping
也必须定义为@Bean
。您可以找到有关此类配置的更多信息
编辑@Tobia的一些想法:
您需要删除@RequestMapping
注释,以便RequestMappingHandlerMapping
不会拾取控制器,并实现AbstractController
接口以覆盖handleRequestInternal()
中的控制器定义。等等,我不确定它是否有效。我使用了setOrder(Ordered.lower\u priority)
而不是1,但它仍然覆盖资源处理程序。我需要在资源处理程序之后考虑它。我使用Spring Boot,所以有几个默认处理程序。我只需要加上我的。我已经检查了应用程序bean(使用applicationContext.getBeansOfType(HandlerMapping.class)
,我可以看到我的加载了order=2147483647,这是一个较高的数字(优先级较低)than order=2147483646 resourceHandlerMapping。这是静态文件的默认SimpleUrlHandlerMapping,URL映射为/static/**
。但每当我调用静态URL时,就会调用我的控制器。我想我知道发生了什么。requestMappingHandlerMapping仍在拾取我的控制器,因为它仍然是作为@RequestMapping注释。但是如果我删除注释,我会得到javax.servlet.ServletException:handler[…]没有适配器。。。Controller@6da127ce]:DispatcherServlet配置需要包含一个支持此处理程序的HandlerAdapter
,因此我必须删除@RequestMapping,实现AbstractController并覆盖HandlerRequestInternal()
“旧方法”(Spring和Spring Boot对“控制器”有不同的定义…)现在它成功了。谢谢你的支持。该死,这是一个相当好的工作。老实说,我自己从来没有实现过它,我不知道有这么多。
@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;
}