【发布时间】: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