使用属性确定子类类型

时间:2018-05-26 07:51:38

标签: java spring rest spring-mvc

我有以下类层次结构

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进行映射。

1 个答案:

答案 0 :(得分:0)

  

我的问题是,这是解决这个问题的最佳方法吗?

这个问题的答案将始终以意见为基础,尤其是因为我们不了解您的整个应用程序,不仅在技术上而且在业务方面,以及客户端代码如何消耗和显示代码。

  

或者我是否必须为每个子类创建一个单独的Controller?

不,不一定。如果代码是并且可能保持简单 - 有时你可以预料到这一点 - 对代码进行膨胀是没有意义的。拥有三个Controllers而不是一个PromotionController很可能会增加冗余代码。否则,如果子类是异构的,那么三个控制器可能更合适。

另一个想法,你可能有一个(人类)客户端只管理Deals,并且该客户端有特殊要求导致只有Deal的一组自定义休息接口,你' d可能喜欢单独Controller

  

我正在寻找在现实世界中做到这一点的最佳方式。

没有最好的办法。五位开发者可能就如何解决这个问题提出五点意见。即使一个人目前更合理,但由于或改变了新的业务需求,它可能在第二天发生变化。

最好的方法是在团队中讨论这个问题,创建一个常识,如果不确定,让首席架构师决定走哪条路。 Imo,你的方法似乎很好。这是我的2美分。