首页 > 解决方案 > 如何在单个控制器/服务方法中处理多个继承的 DTO?

问题描述

我有 PaymentTransactionDTO 作为超类和子类,例如 PhoneBillPaymentTransactionDTO,其中有一个字段为 phoneNumber 等。

我想通过单一支付服务处理这些 DTO。我的控制器方法如下;

public ResponseEntity<TransactionStatus> payment(@PathVariable String accountNumber,
        @Valid @RequestBody PaymentTransactionDTO paymentTransactionDTO)

当我将 PhoneBillPaymentTransactionDTO 发布到上述方法时,我无法到达 phoneNumber 字段,因为我在方法签名中有 PaymentTransactionDTO。

我应该如何设计从单一方法管理多个继承的 dto?

标签: javaspring-bootoopdesign-patternsdto

解决方案


如果使用 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
}

在您仍然可以从“电话”相关代码中调用基本事务控制器方法,或者也可以将您的控制器/服务拆分为依赖于基本实现的特定代码。


推荐阅读