英文:
Method level custom constraint not fired on Spring controller REST method
问题
我正在为一个Spring REST方法创建一个自定义的方法级约束,但验证器根本没有被触发。`isValid` 方法从未被调用。
//
// 控制器
//
@PostMapping("/{id}")
@DTOParametersMatch
public ResponseEntity<DTO> createDTO(
@PathVariable("id") @SuppressWarnings("unused") UUID id,
@Validated(CreateValidation.class) @RequestBody DTO dto
) {
System.out.println("***** createDTO 被调用");
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必须与请求体中的DTO ID相匹配";
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 =
"DTOParametersMatch的使用不正确;需要两个参数,第一个是UUID,第二个是DTO。";
@Override
public boolean isValid(Object[] values, ConstraintValidatorContext context) {
System.out.println("***** DTOParametersMatchValidator isValid 被调用");
var pathId = (UUID) values[0];
var body = (DTO) values[1];
return pathId.equals(body.getId());
}
}
我不确定是否漏掉了什么或者设置有误...
英文:
I'm creating a custom method level constraint for a Spring REST method but the validator is not being triggered at all. The isValid
method is never called.
//
// 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());
}
}
I'm not sure if I missed something or set it up wrong..
答案1
得分: 0
我的其中一位同事指出我在控制器类上缺少了@Validated
注解。一旦我添加了这个注解,一切都正常工作了。
英文:
One of my colleagues pointed out I was missing the @Validated
annotation on the controller class. Once I added that, everything worked.
专注分享java语言的经验与见解,让所有开发者获益!
评论