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美分

谢谢你的回复。该应用程序是优惠券和交易网站,用户可以在这里提交优惠券、交易或产品销售。