最初我只有MyRestController
@CrossOrigin(origins = "*")
@RestController
public class MyRestController {
@RequestMapping(value = "/v1/endpoint", method = {RequestMethod.GET})
public ResponseEntity<Object> endpoint(HttpServletRequest request,
HttpServletResponse response) {
// etc - duplicate code across controllers with the one
// difference of a single function call and its corresponding params
}
}
然后我意识到很多功能在其他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);
}
}
然后我将MyRestController
的类标题更改为
public class MyRestController extends BaseController {
这很有效!
我的问题是:
CrossOrigin
从MyRestController
移到BaseController
?abstract
课程。这个用例对这有帮助吗?path
语句中的switch
将单个函数替换为重复的try / catch,以使用正确的方法和正确的参数。这看起来像个hackish ......有没有更好的方法呢?由于
答案 0 :(得分:1)
查看注释CrossOrigin
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/CrossOrigin.html
这就是为什么它不起作用是因为你的BaseController
没有任何方法可以添加到RequestMappingHandlerMapping
,所以这就是为什么它不起作用。
只要BaseController
是抽象的,除非你有一个方法要求你的扩展控制器覆盖,否则没有必要。
关于Switch的更新
取决于每种情况下会有多少controller
种方法,这取决于您。如果多个方法属于MY_PATH
情况,那么我相信你没问题,但我可以看到这些情况可能变成一个非常冗长的switch语句。这完全取决于你作为维护者。在我看来,我会将switch语句分解为不同的方法,让controller
扩展调用该方法。但这是个人偏好。