我有以下类层次结构
Promotion - abstract
- Coupon
- Sales
- Deals
(优惠券,销售和交易都是促销的子类)。
并且想要在REST API(JSON)和客户端(Angular)之间交换数据时确定对象的类型。用户可以提交优惠券或促销或促销。例如,当客户发送优惠券时,我希望能够知道这是优惠券,以便我可以调用正确的方法。
为了解决这个问题,我在Promotion中声明了一个变量和一个抽象方法。
protected String promotionType = getPromotionType();
protected abstract String getPromotionType();
在优惠券中的子类中,我有类似的内容
protected String getPromotionType() {
return "coupon"
// OR return this.getClass().getSimpleName().toLowerCase();
}
这将自动初始化 promotionType 变量,以便在控制器中我可以检查对象是优惠券还是销售或处理即可。请记住 JSON 以String格式发送数据,因此我必须有办法确定即将发生的对象类型。
在这种情况下,我将有一个控制器来处理我的所有CRUD操作。在我的控制器方法中,我将执行类似::
的操作@PostMapping public void create(@RequestBody Promotion){
// And inside here I will check the type of **promotionType**
}
此处使用促销作为参数,而不是 create()方法中的任何子类。
我的问题是,这是解决这个问题的最佳方法吗?
或者我是否必须为每个子类创建一个单独的Controller?我正在寻找在现实世界中做到这一点的最佳方式。
我正在使用Hibernate进行映射。
答案 0 :(得分:0)
我的问题是,这是解决这个问题的最佳方法吗?
这个问题的答案将始终以意见为基础,尤其是因为我们不了解您的整个应用程序,不仅在技术上而且在业务方面,以及客户端代码如何消耗和显示代码。
或者我是否必须为每个子类创建一个单独的Controller?
不,不一定。如果代码是并且可能保持简单 - 有时你可以预料到这一点 - 对代码进行膨胀是没有意义的。拥有三个Controllers
而不是一个PromotionController
很可能会增加冗余代码。否则,如果子类是异构的,那么三个控制器可能更合适。
另一个想法,你可能有一个(人类)客户端只管理Deals
,并且该客户端有特殊要求导致只有Deal
的一组自定义休息接口,你' d可能喜欢单独Controller
。
我正在寻找在现实世界中做到这一点的最佳方式。
没有最好的办法。五位开发者可能就如何解决这个问题提出五点意见。即使一个人目前更合理,但由于或改变了新的业务需求,它可能在第二天发生变化。
最好的方法是在团队中讨论这个问题,创建一个常识,如果不确定,让首席架构师决定走哪条路。 Imo,你的方法似乎很好。这是我的2美分。