向Spring MVC应用程序添加REST API



假设应用程序使用基于Spring MVC和Thymeleaf的传统UI,似乎有几种方法可以暴露REST API…

  1. 使用@RestController添加一组完全独立的控制器-感觉像很多重复,但允许UI与REST逻辑完全分离

  2. 为每个实体使用单个控制器,混合使用@ResponseBody方法和ModelAndView方法-将给定实体的所有逻辑保留在单个位置,但需要混合不同的概念

  3. 为每个实体使用单个控制器,仅使用ModelAndView,并使用内容协商与JSON视图解析器,如MappingJackson2JsonView (https://spring.io/blog/2013/06/03/content-negotiation-using-views/)

我对#3特别感兴趣,因为它感觉类似于Ruby on Rails控制器如何处理不同内容类型的respond_to。

这是Spring应用程序中的常用方法/最佳实践吗?

POST和DELETE请求仍然需要单独的方法,因为它们可能在REST API与UI之间工作不同?(即发布表单与发布json实体)

是否需要根据它是UI请求还是API请求进行单独的异常处理?

我选择选项1。拥有一组单独的@Controller@RestController可以避免将MVC模式与REST api混合在一起。为了避免代码重复,您应该添加一个服务层,并让REST端点和MVC控制器使用该服务层。