球衣何时应使用@ValidateOnExecution?

zol*_*lee 5 java validation rest jersey

我无法理解@ValidateOnExecution批注的本质。有人可以解释一下用例吗?

根据jersey的文档,对资源方法的约束将自动进行验证。此代码段来自jersey的示例

@GET
@NotNull
@HasId
public List<ContactCard> getContacts() {
    return StorageService.findByName("");
}

@GET
@Path("{id}")
@NotNull(message = "{contact.does.not.exist}")
@HasId
public ContactCard getContact(
        @DecimalMin(value = "0", message = "{contact.wrong.id}")
        @PathParam("id") final Long id) {
    return StorageService.get(id);
}
Run Code Online (Sandbox Code Playgroud)

如果约束在pojo中,则可以使用@Valid触发验证(请参见参考资料)。

@Path("/")
class MyResourceClass {

@POST
@Consumes("application/xml")
public void registerUser(@Valid User user) {
    ...
}
}
Run Code Online (Sandbox Code Playgroud)

那么@ValidateOnExecution除了明确关闭了验证功能外,还有什么用?

dma*_*iuk 2

根据Jersey 最新文档, @ValidateOnExecution注释应用于以下目的:

根据 Bean Validation 规范,默认情况下仅对所谓的约束方法启用验证。Java Beans 规范定义的 Getter 方法不是约束方法,因此默认情况下不会验证它们。特殊注释@ValidateOnExecution可用于有选择地启用和禁用验证。例如,您可以对示例中所示的方法 getEmail 启用验证

@Path("/")
class MyResourceClass {

    @Email
    @ValidateOnExecution
    public String getEmail() {
        return email;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

@ValidateOnExecution 的 type 属性的默认值是 IMPLICIT,这会导致方法 getEmail 被验证。

因此@ValidateOnExecution至少也可以用于启用 getter 方法的验证。