【发布时间】:2018-11-14 05:51:01
【问题描述】:
我正在开发以下优惠券和优惠平台的类层次结构::
Promotion - abstract
- Coupon
- Sale
- Deal
(Coupon、Sale 和 Deal 继承自 Promotion。Promotion 有一个名为 type 的字符串属性和一个用于初始化子类的类型属性为字符串值。例如优惠券中的type 获取值“优惠券”等...)
对于每个子类,我都有一个 DAO 和 Service 类,例如 CouponDAO、CouponService 等。
在前端用户可以通过Angular 2界面创建Coupon或Sale或Deal等我决定使用以下控制器:
PromotionController - abstract
- CouponController
- SaleController
- DealController
(CouponController、SaleController、DealController继承自PromotionController)
PromotionController 将包含所有子类共有的所有通用 CRUD 函数,并且在特定控制器中,我将处理针对这些类的特定操作。
A) 现在面临的问题是如何实例化来自客户端的正确对象。例如,当用户提交 Coupon 或 Sale 或 Deal 时,我如何实例化正确的对象。例如在 PromotionController 我有这样的功能::
@RequestMapping(value=CREATE_PROMO, method=RequestMethod.POST)
public ResponseEntity<?> create(@RequestBody Promotion promotion){
promotionService.save(promotion);
return new ResponseEntity<>("", HttpStatus.OK);
}
Promotion 是抽象的,是函数的参数。我应该使用工厂模式和**type** 属性来创建正确的对象吗?
例如,如果 type="Coupon" 则创建 Coupon 对象,如果是 "Sale" 则创建 Sale 对象
B) 由于控制器使用服务对象,这意味着我必须在 PromotionController 中声明所有三个服务对象。因为在实例化了正确的对象之后,我需要调用其对应的服务来完成这项工作。在上面的方法中,我有promotionService,我认为应该用正确的子类服务替换
C) 我正在寻找如何处理处理现实世界中子类的 REST API,就像我上面描述的情况一样
D) 我想通过将所有 CRUD 操作复制到它们的特定控制器来简化自己的工作,但似乎这将是重复的代码。
我认为有更好的方法可以做到。
如果我能找到一个处理这种情况的开源项目,我也尝试过,但似乎我发现的所有项目都使用一个类而不是继承。他们的 REST/API 不处理继承情况
【问题讨论】:
-
首先,我不建议您使用抽象的
@Controller,因为@Controller是通过端点进入应用程序的入口。如果一个端点调用 2 个或更多控制器,这可能会导致一些麻烦。
标签: java spring rest spring-mvc spring-boot