Spring 同一路由如何匹配多种请求?

比如我可以通过 post/{id} 请求文章详情页,也可以通过 post/{alias} 请求文章详情页
应该如何实现?

阅读 2.5k
4 个回答

如果文章id为整型,那么可以使用强转来判断是否是文章id还是alias,如下

@GetMapping("post/{idOrAlias}")
    public R mypost(@PathVariable("idOrAlias") String idOrAlias) {

        try {
            Integer id = Integer.valueOf(idOrAlias);
            // id的处理逻辑

        } catch (NumberFormatException e) {
            // alias的处理逻辑
            
        }
        return R.ok();
    }
@Slf4j
@RestController
@RequestMapping
public class IndexController {

    @GetMapping({"post/{id}", "post/{alias}"})
    public String index(@PathVariable(value = "id", required = false) Integer id,
                        @PathVariable(value = "alias", required = false) String alias) {
        log.info("postId=>{}, postAlias=>{}", id, alias);
        return "index";
    }
}
2022-10-09 11:40:54.465  INFO 22878 --- [io-19999-exec-1] com.example.nadp01.IndexController       : postId=>null, postAlias=>123
2022-10-09 11:41:06.235  INFO 22878 --- [io-19999-exec-3] com.example.nadp01.IndexController       : postId=>null, postAlias=>hello world

这样即可


这玩意确实有问题,(。・_・。)ノI’m sorry~

PathVariableMethodArgumentResolver解析,遇到aliasid 优先使用alias(字典序)解析,正好是String类型,便直接由alias接收。

只能这样做了,或者自己实现一个ArgumentResolver,不过没太大必要

@GetMapping({"post/{alias}"})
public String index(@PathVariable String alias) {
    if (StringUtils.isNumeric(alias)) {
        log.info("id=>{}", alias);
    } else {
        log.info("alias=>{}", alias);
    }
    return alias;
}

可以通过 post/{id} 请求文章详情页,也可以通过 post/{alias} 请求文章详情页


你这两个都是用来访问详情页的,而且还要拼在uri中,没有办法区分呀,你可以使用post/{postId}查数据库的时候可以用id=#{postId} or alias=#{postId}

post/{id}和 post/{alias} 本质上就是一个url,影响阶段只在参数绑定,你完全可以用一个参数接收,业务上自己去兼容id和alias

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏