[英]Should I have a separate controller for my REST methods? [closed]
我有一个Java Web应用程序,目前有两个控制器。
一个用于REST调用的控制器,另一个用于将ModelAndView(使用Spring MVC)对象传递给视图的控制器。
我担心的是,这两种方法都引用相同的服务层调用。 我是否应该创建一个抽象类,其中包含与服务层交互的代码?
REST控制器是否应该与其他控制器合并?
我将确保控制器中没有任何逻辑。 控制器仅应获取请求,调用另一个方法(在服务层中-比API层低一层),然后以适当的格式返回数据。
因此,例如:
public class MyServiceLayer() {
public List<SomeObject> getAllSomeObjects() {
// Do some logic to get the object back
}
}
然后,您可以拥有一个像这样的控制器:
@Controller
public class MyController {
@Autowired
private MyServiceLayer myService;
// Put annotation for getting it in Json
public List<SomeObject> getAllSomeObjectsInJson() {
return myService.getAllSomeObjects();
}
// Put annotation for getting the view data
public ModelAndView getAllSomeObjectsView() {
// Return your ModelAndView here.
}
}
在这种情况下,如果您愿意,也可以将其拆分为2个控制器。
无论如何,您不应有2个具有重复代码的控制器-太糟糕了! 而且您不应该强制将2个不同的控制器组合为一个。 这就是为什么您应该将逻辑带到另一个打包的层。
同样,您遵循“做一件事的原则”,即一类应该有一个目的。 在这种情况下, MyServiceLayer
具有一个目的-处理获取对象的逻辑。 控制器层有一个目的-传输数据(所需的任何格式)。 例如,如果明天您想添加JMX API,则无需复制代码或扩展原始控制器。 只需添加另一个类来处理JMX调用并使用MyServiceLayer
代码重复几乎总是表明有问题的代码应打包在某种可重用的组件中。 这是我对Spring MVC控制器结构采取的方法:
表示某种逻辑操作的代码应放在服务Bean中。 系统中的某些其他组件可能会将此代码作为其工作流程的一部分合理地调用,并且它需要可独立测试。
控制器类仅包含将HTTP请求转换为系统操作所需的代码。 在许多情况下,这意味着它们只包装对服务方法的单个调用。
当我在同一路径上同时显示资源的JSON和HTML视图时,我会在正确的位置创建带有@RequestMapping
批注的抽象控制器类,并使用@RestController
对其进行扩展, @RestController
将返回所讨论对象的资源表示形式(如来自Spring HATEOAS的ResourceSupport
),以及一个基于HTML的模型和视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.