在弹簧靴中定义基座控制器?

时间:2018-02-22 22:34:32

标签: spring-mvc spring-boot

最初我只有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 {

这很有效!

我的问题是:

  • 为什么我无法将CrossOriginMyRestController移到BaseController
  • 我被告知要使用abstract课程。这个用例对这有帮助吗?
  • 我使用path语句中的switch将单个函数替换为重复的try / catch,以使用正确的方法和正确的参数。这看起来像个hackish ......有没有更好的方法呢?

由于

1 个答案:

答案 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扩展调用该方法。但这是个人偏好。