java - 如何在单个控制器/服务方法中处理多个继承的 DTO?
问题描述
我有 PaymentTransactionDTO 作为超类和子类,例如 PhoneBillPaymentTransactionDTO,其中有一个字段为 phoneNumber 等。
我想通过单一支付服务处理这些 DTO。我的控制器方法如下;
public ResponseEntity<TransactionStatus> payment(@PathVariable String accountNumber,
@Valid @RequestBody PaymentTransactionDTO paymentTransactionDTO)
当我将 PhoneBillPaymentTransactionDTO 发布到上述方法时,我无法到达 phoneNumber 字段,因为我在方法签名中有 PaymentTransactionDTO。
我应该如何设计从单一方法管理多个继承的 dto?
解决方案
如果使用 Jackson,您可以在父类上使用@JsonTypeInfo/@JsonSubTypes来实现,但仍需要强制转换才能到达 phoneNumber。
为避免任何类强制转换,您需要根据需要使用尽可能多的签名(每个 PaymentTransactionDTO 的子类至少一个)重载控制器方法,并具有明确的 JSON 结构要求
// should handle requests containing a phoneNumber attribute
@RequestMapping(method = RequestMethod.GET, params = {"phoneNumber"})
public ResponseEntity<TransactionStatus> payment(@PathVariable String accountNumber,
@Valid @RequestBody PhoneBillPaymentTransactionDTO phoneBillPaymentTransactionDTO) {
// code handling specially phone
}
// should handle any request not containing other specified attributes
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<TransactionStatus> payment(@PathVariable String accountNumber,
@Valid @RequestBody PaymentTransactionDTO paymentTransactionDTO) {
// code handling the generic transaction
}
在您仍然可以从“电话”相关代码中调用基本事务控制器方法,或者也可以将您的控制器/服务拆分为依赖于基本实现的特定代码。
推荐阅读
- sql - 将带有其他数据的逗号分隔字符串附加到另一个表
- python - Python:尝试在函数中使用“re”时出现 NameError
- python - pyinstaller 生成的 exe 可以访问用户创建的输入文件吗?
- python - 如何通过脚本打开“与 SMB 共享文件和文件夹”
- python - 如何重新分配与列表匹配的系列中的值
- sharepoint - SharePoint FX 与 Angular 的集成如何?
- php - 图像存储链接在 laravel 的在线服务器中不起作用
- ios - 返回 GameScene 时内存增加
- c# - 由于每个页面上的表单标签,Web 应用程序项目无法访问
- angular - Angular 7/8 响应开发服务器上的健康检查