现在工作中有这样一个需求,需要我把 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;
}
}
真有大佬能提供解决思路,我愿意有偿哈~多谢了
可以通过转发实现
@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!";
}
}