如何解决当 DTO 有 @NotNull 时,使用 ModelMapper 映射不会抛出异常?
我的问题是我有一个名为 PhoneBillPaymentDTO 的 dto,它有一个用 @NotNull 注释的电话号码字段。当我使用 modelmapper 将此具有空电话号码的 dto 映射到 PhoneBillPayment 实体时,它不会引发异常。
当 notnull 值设置为 null 时,如何让它抛出异常?
这是我的课程;
public class PhoneBillPaymentTransactionDTO extends PaymentTransactionDTO {
@NotNull
private String phoneNumber;
public PhoneBillPaymentTransactionDTO() {
}
public PhoneBillPaymentTransactionDTO(@NotNull BigDecimal amount,@NotNull TransactionTypes type,@NotNull String payeeAccountNumber,@NotNull String owner,@NotNull String phoneNumber) {
super(amount,type,payeeAccountNumber,owner);
this.phoneNumber = phoneNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
控制器:
@PostMapping(path = "/payment/{accountNumber}")
public ResponseEntity<TransactionStatus> payment(@PathVariable String accountNumber,@Valid @RequestBody PaymentTransactionDTO paymentTransactionDTO) throws InsufficientBalanceException {
return new ResponseEntity<>(
accountService.payment(accountNumber,MapperUtil.createTrxByTrxDTO(paymentTransactionDTO)),HttpStatus.OK);
}
映射器实用程序:
public final class MapperUtil {
private MapperUtil() {
}
private static final modelmapper mapper = new modelmapper();
public static final Transaction createTrxByTrxDTO(TransactionDTO dto) {
if (dto.getType() == TransactionTypes.DEPOSIT) {
return mapper.map(dto,DepositTransaction.class);
}
if (dto.getType() == TransactionTypes.WITHDRAWAL) {
return mapper.map(dto,WithdrawalTransaction.class);
}
if (dto.getType() == TransactionTypes.PAYMENT) {
return mapper.map(dto,PaymentTransaction.class);
}
if (dto.getType() == TransactionTypes.PHONEBILLPAYMENT) {
mapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
return mapper.map(dto,PhoneBillPaymentTransaction.class);
}
throw new UnsupportedTransactionTypeException();
}
}
解决方法
首先:我很确定 ModelMapper 不会开箱即用地进行 JSR-303 注释验证。您需要对生成的 bean 使用编程验证器。
但是你的方法中更大的问题是:
在您的控制器中,您期望 PaymentTransactionDTO
。这可能由 Spring 验证,但因为 Spring 不知道它实际上可能是 PhoneBillPaymentTransactionDTO
,因此 phoneNumber
- 例如 - 应该验证它只是没有完成。
现在,如果您对此进行更多测试并记录 Spring(或 Jackson)从您的输入中反序列化的内容 - 再次 - 是 PaymentTransactionDTO
用于控制器方法,它可以有 phoneNumber
吗?我敢打赌,您已经在 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES = false
的某个地方进行了配置,使其能够运行这么远。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。