【问题标题】:Method level custom constraint not fired on Spring controller REST method在 Spring 控制器 REST 方法上未触发方法级别自定义约束
【发布时间】:2020-07-23 15:46:11
【问题描述】:

我正在为 Spring REST 方法创建自定义方法级别约束,但根本没有触发验证器。 isValid 方法永远不会被调用。

//
// Controller
//

@PostMapping("/{id}")
@DTOParametersMatch
public ResponseEntity<DTO> createDTO(
    @PathVariable("id") @SuppressWarnings("unused") UUID id,
    @Validated(CreateValidation.class) @RequestBody DTO dto
) {
  System.out.println("***** createDTO called");
  DTO created = dtosService.createDTO(dto);
  return ResponseEntity.status(HttpStatus.CREATED).body(created);
}


//
// DTOParametersMatch
//

@Constraint(validatedBy = DTOParametersMatchValidator.class)
@Target({ METHOD, CONSTRUCTOR })
@Retention(RUNTIME)
@Documented
public @interface DTOParametersMatch {

  String message() default "DTO ID in path must match DTO ID in body";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}


//
// DTOParametersMatchValidator
//

@SupportedValidationTarget(PARAMETERS)
public class DTOParametersMatchValidator implements ConstraintValidator<DTOParametersMatch, Object[]> {

  private static final String ILLEGAL_ARGS_BASE =
      "Illegal usage of DTOParametersMatch; "
          + "requires two parameters where first is a UUID and second is a DTO.";

  @Override
  public boolean isValid(Object[] values, ConstraintValidatorContext context) {
    System.out.println("***** DTOParametersMatchValidator isValid called");

    var pathId = (UUID)v0;
    var body = (DTO)v1;

    return pathId.equals(body.getId());
  }
}

我不确定我是否遗漏了什么或设置错误..

【问题讨论】:

    标签: java spring-boot constraints


    【解决方案1】:

    我的一位同事指出我缺少控制器类上的 @Validated 注释。添加后,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 2020-04-29
      • 2018-11-13
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多