Spring MVC同正则路径映射校验问题:需程序化验证并跳转控制器
解决Spring MVC多控制器路径匹配与动态跳转问题
针对你提出的需求,我来帮你梳理下具体的实现方案,用Spring MVC的原生机制就能搞定这个场景:
核心思路
- 让动物控制器优先匹配路径,当数据库里找不到对应
animalCategory时,告诉Spring MVC继续尝试匹配下一个符合路径规则的控制器(也就是植物控制器) - 植物控制器作为最后一个匹配项,一旦校验数据库不存在
plantCategory,直接返回404状态码即可
步骤1:修正路径变量的正则写法
首先得把你示例里的路径写法改成Spring MVC标准格式——路径变量和正则之间要用冒号分隔,不能用空格:
// 正确的路径正则写法 @GetMapping("/{animal-category:[a-z-]+}/{animal-name:[a-z-]+}")
步骤2:实现动物控制器逻辑
给动物控制器设置更高的优先级,确保它先被匹配。在方法里校验数据库:如果分类存在就正常处理,不存在就返回null,让Spring去寻找下一个匹配的控制器:
@Controller @Order(1) // 优先级高于植物控制器,确保先被匹配 public class AnimalController { @Autowired private AnimalService animalService; // 假设这是你的数据库校验服务 @GetMapping("/{animal-category:[a-z-]+}/{animal-name:[a-z-]+}") public String showAnimal( @PathVariable("animal-category") String animalCategory, @PathVariable("animal-name") String animalName, Model model) { // 校验数据库中是否存在该动物分类 if (!animalService.isCategoryExists(animalCategory)) { // 返回null,让Spring继续匹配下一个控制器 return null; } // 分类存在时,正常处理请求(比如返回视图、填充数据) model.addAttribute("animal", animalService.getAnimalByCategoryAndName(animalCategory, animalName)); return "animal/detail"; } }
步骤3:实现植物控制器逻辑
植物控制器优先级设低一些,作为兜底匹配。如果校验数据库找不到分类,直接抛出404异常即可:
@Controller @Order(2) // 优先级低于动物控制器,后被匹配 public class PlantController { @Autowired private PlantService plantService; // 假设这是你的数据库校验服务 @GetMapping("/{plant-category:[a-z-]+}/{plant-name:[a-z-]+}") public String showPlant( @PathVariable("plant-category") String plantCategory, @PathVariable("plant-name") String plantName, Model model) { // 校验数据库中是否存在该植物分类 if (!plantService.isCategoryExists(plantCategory)) { // 无后续控制器,直接返回404 throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Plant category not found"); } // 分类存在时,正常处理请求 model.addAttribute("plant", plantService.getPlantByCategoryAndName(plantCategory, plantName)); return "plant/detail"; } }
关键细节说明
- @Order注解的作用:DispatcherServlet会按照
@Order的数值从小到大依次匹配控制器,确保动物控制器先被尝试 - 返回null的意义:Spring MVC中,控制器方法返回
null且未指定视图时,会认为当前处理器无法处理请求,自动去查找下一个符合路径规则的处理器 - 404的实现方式:用
ResponseStatusException是Spring 5+推荐的动态抛异常方式,比@ResponseStatus注解更灵活,能根据运行时逻辑决定是否返回404
内容的提问来源于stack exchange,提问作者Vojtěch
相关产品推荐
相关产品推荐

