微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当 DTO 有 @NotNull 时,使用 ModelMapper 映射不会抛出异常?

如何解决当 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 举报,一经查实,本站将立刻删除。