我试图在我正在写作的休息服务中进行声明式验证。我写了两个注释,一个针对TYPE,一个是有效的,另一个是针对PARAMETER的,它没有。我试图找出原因。
我们正在使用Spring Boot将所有内容连接在一起。鉴于目标TYPE有效,我假设问题不在于配置,而在于代码。我从休息控制器中的方法开始使用以下方法签名
@RequestMapping(
value = "/{itemId}",
method = RequestMethod.PUT,
consumes = APPLICATION_JSON_VALUE,
produces = APPLICATION_JSON_VALUE
)
public ResponseEntity<Item> update(
@PathVariable("basketId") @Valid @ValidateBasketIdParameter UUID basketId,
@PathVariable("itemId") UUID itemId,
@RequestBody @Valid ItemUpdateRequest request,
HttpServletResponse response) {
...
}
您可以在方法签名上看到@ValidateBasketIdParameter注释,它是不起作用的注释。 ItemUpdateRequest参数上的@Valid查找我编写的注释并用以下内容修饰该类:
@UpdateItemValidator
public class ItemUpdateRequest { ... }
2个注释几乎完全相同。这是有效的:
@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = {UpdateItemValidator.Validator.class})
public @interface UpdateItemValidator {
class Validator implements
ConstraintValidator<UpdateItemValidator, ItemUpdateRequest> {
然后我覆盖isValid()并将其称为一天。 @ValidateBasketIdParameter注释定义的唯一区别是类名更改,@ Target成为PARAMETER。但是,当针对TYPE的类时,该类永远不会被触发。我缺少什么或不理解?