我正在实现仅验证事务的微服务从请求主体,如果有效,请将其发送到下一个微服务。我已经实现了验证器,但似乎无法正常工作
交易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;
}