求助! springboot 如何获取 url 上的参数,@PathVariable 复用问题

发布于 2021-05-27 21:39:17

现在工作中有这样一个需求,需要我把 c#的一个项目里的接口都转成 java 实现。这些接口都有共同的请求规则:/{controller}/{action}/{apiVersion}/{userId}/{clientName},举例子比如: http://127.0.0.1:8080/home/index/6.0.0/0/Any. 前面两个参数是 controller 名和方法名,这个我都可以在 @RequestMapping 里写死,但是后面的 apiVersion 、userId 、clientName 这些参数,我不可能在每个 controller 方法的注解上都写上占位符然后用 @PathVariable 获取吧,太 low 了,后期想统一维护都没法维护,而且这些参数要求如果 url 里没有的话要赋默认值。所以问问大佬们,springboot 中如何有没有更好的实现方式呢?无论是拦截器、aop,想来想去都没有太明确的思路。

原 c#项目里是用路由实现的,这样配置后都会自动去找 controller 里的方法,并且给方法入参赋(默认)值:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{apiVersion}/{userId}/{clientName}",
    defaults: new
    {
    controller = "Home",
    action = "Index",
    apiVersion = "6.0.0",
    userId = "0",
    clientName = ClientNames.Any
    }
});

我现在写出来只能是这样的,但我不能 200 多个接口都这样写吧:

@RestController
@RequestMapping("/home")
public class HomePageController {

    @RequestMapping("/index/{apiVersion}/{userId}/{clientName}")
    public IndexResponse index(@PathVariable("apiVersion") String apiVersion,
                               @PathVariable("userId") String userId,
                               @PathVariable("clientName") String clientName) {
        return null;
    }
}

真有大佬能提供解决思路,我愿意有偿哈~多谢了

查看更多

关注者
0
被浏览
475
actar
actar 2021-05-27
这家伙很懒,什么也没写!

可以通过转发实现

@RestController
public class DefaultController {

@RequestMapping("/{controller}/{action}/{apiVersion}/{userId}/{clientName}")
public void index(@PathVariable String controller,
@PathVariable String action,
@PathVariable String apiVersion,
@PathVariable String userId,
@PathVariable String clientName, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setAttribute("apiVersion", apiVersion);
request.setAttribute("userId", userId);
request.setAttribute("clientName", clientName);

request.getRequestDispatcher(String.format("/%s/%s", controller, action)).forward(request, response);
}

@RequestMapping("/home/index")
public String hello(HttpServletRequest request) {
System.out.println(request.getAttribute("apiVersion"));
System.out.println(request.getAttribute("userId"));
System.out.println(request.getAttribute("clientName"));
return "Hello World!";
}

}
1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览