首页 > 解决方案 > 扩展默认的验证组默认不被验证

问题描述

我有以下验证组:

public class ValidationGroups {

    public interface Create extends Default {}

    public interface Update extends Default {}

}

我的注释实体:

public class Usuario implements UserDetails {

    @NotNull(groups = { Update.class })
    @NotBlank(groups = { Update.class })
    @Length(max = 255, groups = { Update.class })
    private String name;

    @NotNull @NotEmpty @Email
    private String email;

}

但是当我尝试使用默认验证来验证我的实体时,该字段name根本没有经过验证,即使它是显式扩展的组Default(使用注释@Valid也会这样做):

@PostMapping("signup")
public String createUser(@Validated User user, 
            BindingResult result, Model model, RedirectAttributes redirectAttributes) {

我可以验证所有字段的唯一方法是在 @Validated 注释中显式添加 Default 组,如下所示:

@PostMapping("signup")
public String createUser(@Validated({ Default.class, Update.class }) User user, 
            BindingResult result, Model model, RedirectAttributes redirectAttributes) {

Default当没有指定组时,默认情况下不应该验证所有带有扩展组注释的字段吗?

标签: javaspringvalidationbean-validationspring-validator

解决方案


我今天遇到了类似的问题,所以这可能会在将来对其他人有所帮助 - 默认关系以相反的方式工作,如下所述: JSR303 验证组继承

当您使用@Validated(Update.class)时,应用的验证是属于 Update.class 及其所有继承链的验证,因此在这种情况下,Update.class 和 Default.class 都将适用。

您正在尝试做的是相反的方式,即保持@Valid 为所有验证组工作。为此,您需要为您的班级重新定义 Default 组:

@GroupSequence({Usuario.class, Update.class}) public class Usuario implements UserDetails

这将允许 @Valid 应用所有验证。


推荐阅读