Java 使用属性确定子类类型
我有下面的类层次结构Java 使用属性确定子类类型,java,spring,rest,spring-mvc,Java,Spring,Rest,Spring Mvc,我有下面的类层次结构 Promotion - abstract - Coupon - Sales - Deals (优惠券、销售和交易都是促销的子类) 并希望在RESTAPI(JSON)和客户端(Angular)之间交换数据时确定对象的类型。用户可以提交优惠券或交易或销售。例如,当从客户端发送优惠券时,我希望能够知道这是优惠券,以便调用正确的方法 为了解决这个问题,我在Promotion中声明了一个变量和一个抽象方法 protected String promotionTyp
Promotion - abstract
- Coupon
- Sales
- Deals
(优惠券、销售和交易都是促销的子类)
并希望在RESTAPI(JSON)和客户端(Angular)之间交换数据时确定对象的类型。用户可以提交优惠券或交易或销售。例如,当从客户端发送优惠券时,我希望能够知道这是优惠券,以便调用正确的方法
为了解决这个问题,我在Promotion中声明了一个变量和一个抽象方法
protected String promotionType = getPromotionType();
protected abstract String getPromotionType();
在子类中,例如在优惠券中,我有这样的东西
protected String getPromotionType() {
return "coupon"
// OR return this.getClass().getSimpleName().toLowerCase();
}
这将自动初始化促销类型变量,以便在控制器中检查对象是否为优惠券或销售或交易。请记住,JSON以字符串格式发送数据,因此我必须有一种方法来确定对象的类型
在这种情况下,我将有一个控制器来处理我的所有CRUD操作。在我的控制器方法中,我将执行如下操作:
@PostMapping public void create(@RequestBody Promotion){
// And inside here I will check the type of **promotionType**
}
这里我使用了升级作为参数,而不是create()方法中的任何子类
我的问题是,这是解决这个问题的最好办法吗
或者我必须为每个子类创建一个单独的控制器吗?我在寻找现实世界中最好的方法
我正在使用Hibernate进行映射
我的问题是,这是解决这个问题的最好办法吗
这个问题的答案总是基于意见,尤其是因为我们不知道您的整个应用程序,不仅从技术上,而且从业务角度,以及客户端代码如何使用和显示代码
或者我必须为每个子类创建一个单独的控制器吗
不,不一定。如果代码是并且可能会保持简单——有时你可以预料到这一点——那么夸大代码是没有意义的。有三个控制器
而不是一个促销控制器
很可能会增加冗余代码。否则,如果子类相当异构,则建议使用三个控制器
另一种想法是,您可能有一个(人工)客户机,它只管理交易
,并且该客户机有特殊的要求,导致只为交易
定制一系列rest接口,您可能希望有一个单独的控制器
我在寻找现实世界中最好的方法
没有最好的办法。对于如何解决这个问题,五位开发者可能有五种意见。即使一个在目前更为合理,它也可能在第二天因新的业务需求而改变
最好的方法是在团队中讨论这个问题,建立一个常识,如果不确定,让首席架构师决定走哪条路。依我看,你的方法似乎还不错。那是我的2美分 谢谢你的回复。该应用程序是优惠券和交易网站,用户可以在这里提交优惠券、交易或产品销售。