首页 > 解决方案 > Spring验证器类不验证Dto数据

问题描述

我正在实现一个微服务,它只需要验证来自请求正文的事务 ,如果它有效,则将其发送到下一个微服务。我已经实现了Validator,但它似乎不起作用

交易 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");
        }
    }
    ...
}

Controller 什么都不做,只是简单地返回它接收到的事务:

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

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

标签: javaspring

解决方案


我相信 @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?
}

或在您的控制器中直接自动装配 TransactionValidation 并调用“验证”传入 Transaction 和 Errors 对象

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

推荐阅读