弹簧验证器类未验证DTO数据

  • 本文关键字:验证 DTO 数据 java spring
  • 更新时间 :
  • 英文 :


我正在实现仅验证事务的微服务从请求主体,如果有效,请将其发送到下一个微服务。我已经实现了验证器,但似乎无法正常工作

交易DTO:

public class Transaction {
    private TransactionType transactionType;
    private String iban;
    private String CNP;
    private String name;
    private String description;
    private Float sum;
    ...
}

验证器:

@Component()
public class TransactionValidation implements Validator {
    @Override
    public boolean supports(Class<?> aClass) {
        return Transaction.class.equals(aClass);
    }
    @Override
    public void validate(Object object, Errors errors) {
        Transaction transaction = (Transaction) object;
        if(!isValidCnp(transaction.getCNP())){
            errors.rejectValue("CNP", "CNP validation error");
        }
        if(!isValidIban(transaction.getIban())){
            errors.rejectValue("IBAN", "IBAN validation error");
        }
        if(isInputStringEmpty(transaction.getName())){
            errors.rejectValue("name", "Name validation error");
        }
    }
    ...
}

控制器什么也没做,但简单地返回了它收到的交易:

@PostMapping()
public Transaction validateTransaction(@RequestBody @Valid Transaction transaction){
    return transaction;
}

但似乎不起作用,似乎该应用不使用上面实现的验证器。为什么?我必须在任何地方注册验证器吗?

我相信@Valid注释在JSR-303验证规范上有效,并在您的DTO中使用注释。您有2个选项

public class Transaction {
    @NonNull
    @NotEmpty
    @NumericIbanConstriant 
    private String iban;
}
@Constraint(validatedBy = NumericIbanConstriantValidator.class)
public @interface NumericIbanConstriant {
}
public NumericIbanConstriantValidator implements ConstraintValidator<NumericIbanConstraint, String> {
   // validation logic for iban string being numeric perhaps?
}

或在您的控制器中直接自动自动自动化事务效果并调用"验证"通过事务中的"验证",并且错误对象

@PostMapping()
public Transaction validateTransaction(@RequestBody Transaction transaction, Errors errors){
    transactionValidation.validate(transaction, errors);
    return transaction;
}

最新更新