Spring mvc 在spring boot中定义基本rest控制器?
最初我只有Spring mvc 在spring boot中定义基本rest控制器?,spring-mvc,spring-boot,Spring Mvc,Spring Boot,最初我只有MyRestController abstract class BaseController { public ResponseEntity<Object> run(String path, String[] params) { Object result = null; switch (path.toLowerCase()) { // case for each path case
MyRestController
abstract class BaseController {
public ResponseEntity<Object> run(String path, String[] params) {
Object result = null;
switch (path.toLowerCase()) {
// case for each path
case MY_PATH:
result = someService.myPath(param[0]);
break;
case MY_OTHER_PATH:
result = someService.myOtherPath(param[0], param[1]);
break;
default:
System.out.println("No");
throw new Exception();
}
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
@CrossOrigin(origins=“*”)
@RestController
公共类MyRestController{
@RequestMapping(value=“/v1/endpoint”,method={RequestMethod.GET})
公共响应端点(HttpServletRequest),
HttpServletResponse(响应){
//etc-在控制器之间使用一个
//单个函数调用及其相应参数的差异
}
}
然后我意识到许多功能在其他6个控制器中被重用,所以我使用抽象的BaseController
abstract class BaseController {
public ResponseEntity<Object> run(String path, String[] params) {
Object result = null;
switch (path.toLowerCase()) {
// case for each path
case MY_PATH:
result = someService.myPath(param[0]);
break;
case MY_OTHER_PATH:
result = someService.myOtherPath(param[0], param[1]);
break;
default:
System.out.println("No");
throw new Exception();
}
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
这就成功了
我的问题是:
- 为什么我不能将
从CrossOrigin
移动到MyRestController
BaseController
- 我被告知使用
抽象类。这在这个用例中有帮助吗
- 我使用
语句中的switch
将重复的try/catch替换为单个函数,以使用正确的方法和正确的参数。这似乎有点骇人听闻。。。有更好的方法吗path
感谢查看注释的文档
CrossOrigin
这就是它不起作用的原因,因为您的BaseController
没有任何方法添加到RequestMappingHandlerMapping
中,所以它不起作用
只要BaseController
是抽象的,就没有必要这样做,除非您有一种方法希望您的扩展控制器覆盖它
关于交换机的更新
这实际上取决于每种情况下的controller
方法数量。如果有多个方法属于MY_PATH
的情况,那么我相信您没有问题,但是我可以看到这些情况可能会变成一个非常长的switch语句。这真的取决于作为维护者的您。在我看来,我会将switch语句案例分解为不同的方法,并让扩展的控制器调用该方法。但这是个人偏好。好的,太好了,我理解你的两个答案。非常感谢。最后一个问题你介意试一试吗?我想我会保持一切不变,只是把抽象的改成普通的类。再次感谢!