【问题标题】:How To Validate Rest Request In Spring Boot如何在 Spring Boot 中验证 Rest 请求
【发布时间】:2019-01-21 16:00:51
【问题描述】:

我正在尝试根据某些字段的存在来验证我的休息请求。例如,如果我的请求对象中的 transactionDate 字段为 null 或不存在,我想向客户端抛出错误。

尽管有本指南的来源,我还是做不到,但我的请求仍然可以通过控制器。

How can I validate two or more fields in combination?

DTO

@FraudRestRequestValidator
public class FraudActionsRestRequest {
private BigDecimal amount;
    private String receiverTransactionDate;
    private String receiverNameSurname;
    private BigDecimal exchangeRate;
    private String transactionReferenceNumber;
    @NotNull
    private String transactionDate;
    @NotNull
    private String transactionTime;
    private String transactionTimeMilliseconds;
    private BigDecimal tlAmount;
    private String channel;
}

注释

@Constraint(validatedBy = FraudActionsRestValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface FraudRestRequestValidator {
    String message() default "Invalid Limit of Code";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

验证器

public class FraudActionsRestValidator implements ConstraintValidator<FraudRestRequestValidator, FraudActionsRestRequest> {

    @Override
    public void initialize(FraudRestRequestValidator constraintAnnotation) {

    }

    @Override
    public boolean isValid(FraudActionsRestRequest fraudActionsRestRequest, ConstraintValidatorContext constraintValidatorContext) {
        //I will implement my logic in future
        return false;
    }
}

休息控制器

@PostMapping("/getFraudActions")
    public ResponseEntity<?> getFraudActions(@Valid @RequestBody FraudActionsRestRequest fraudActionsRestRequest, Errors errors) throws Exception

谢谢。

【问题讨论】:

    标签: java validation spring-boot


    【解决方案1】:

    在您的自定义验证器中,只需实现您想要的逻辑。除了一些小事,你做的一切都是正确的:

    @Constraint(validatedBy = FraudActionsRestValidator.class)
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ValidFraudRestRequest {
        String message() default "Invalid Limit of Code";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
    
    public class FraudActionsRestValidator implements ConstraintValidator<ValidFraudRestRequest, FraudActionsRestRequest> {
    
        @Override
        public void initialize(ValidFraudRestRequest constraintAnnotation) {
    
        }
    
        @Override
        public boolean isValid(FraudActionsRestRequest fraudActionsRestRequest, ConstraintValidatorContext constraintValidatorContext) {
    
            return fraudActionsRestRequest.getTransactionDate() != null && fraudActionsRestRequest.getTransactionTime() != null && additional check you need;
        }
    }
    

    【讨论】:

    • OP 从isValid() 返回false,这就是所需要的。
    【解决方案2】:

    看起来一切正常。

    您可能缺少其余控制器类上的 @Validated 注释,

    更多信息请见https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-validation.html

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 2023-03-22
      • 2022-01-22
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      相关资源
      最近更新 更多