java—如何在单个控制器/服务方法中处理多个继承的DTO?

pkmbmrz7  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(230)

我有paymenttransactiondto作为超类和子类,比如phonebillpaymenttransactiondto,它有一个字段作为phonenumber等等。
我想从单一支付服务处理这些DTO。我的控制器方法如下;

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

当我将phonebillpaymenttransactiondto发布到上述方法时,我无法访问phonenumber字段,因为我在方法签名中有paymenttransactiondto。
我应该如何设计从单个方法管理多个继承的dto?

slwdgvem

slwdgvem1#

如果使用jackson,您可以通过父类上的@jsontypeinfo/@jsonsubtypes实现这一点,但是仍然需要一个cast来达到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
}

在下面,您仍然可以从“phone”相关代码调用基本事务控制器方法,或者也可以根据基本实现将控制器/服务拆分为特定代码。

相关问题