正如我已经几次面临这个问题没有很好地解决REST API建设者:REST API设计查询
拥有它似乎很清楚一个实体组织,我们可以休息型号为/组织,所有的包(GET,POSt,PUT,DELETE,过滤,分页,...)
请注意,我使用Spring将@RestController类和spring-data PagingAndSortingRepository注入到控制器中。
的问题
/组织/(编号)开始/用户
这是一个REST API一个完美的URL,但开始引起一些疼痛。
如果我们按照在组织控制器中处理请求的路径,我们需要将UserDAO添加到控制器,所以我们可以在每个控制器中注入很多DAOS并且每个控制器都负责返回许多不同的对象:组织,用户,型号等
将问题推到DAO层不是解决方案;试图使存储库返回所有这些不同的对象将不起作用(PagingAndSortingRepository应该抱怨,如果我们试图与不同的实体一起工作),并且它感觉不到正确的事情,因为我们强制存储库与其领域之外的实体一起工作。
在控制器和DAO之间使用中间层可以工作,一个服务层可以容纳这些不同的DAO并提供一个外观,但又会感觉错误:首先,控制器仍在处理许多不属于它的对象其次,我们有一个没有真正目的的图层,可以使用DAO的组合来增长,或者拥有一个可以查询任何东西的伟大的主DAO对象。
解决这个问题的好方法是什么?
mmm ...不确定理解,因为你在最后注入了两个DAO ......但我想也许你的建议是使用通用DAO的泛型控制器和一个机制来确定具体需要哪些DAO请求,并将在运行时实例化具有特定DAO的特定控制器以提供该特定请求。这是它吗? – Rafael
@Rafael你错过了。首先没有通用控制器 - 只是你的常规控制器。其次,没有DAO被注入,它们只是在Spring中被创建为bean,但没有被注入到任何地方。但是你有一个工厂可以保存对它们的引用 - 每个bean都将自己放入工厂地图的构造函数中。然后在您的控制器运行时,您可以通过工厂获得任何DAO –