JSR-303验证组定义默认组

问题描述 投票:11回答:2

我有一个bean,它有很多用JSR-303验证注释注释的字段。现在有一个新要求,其中一个字段是强制性的,但仅限于某些条件。

我环顾四周,找到了我需要的东西,验证组。

这就是我现在拥有的:

public interface ValidatedOnCreationOnly {
}

@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255)
@NotNull
private String firstName;
@Length(max = 255)
@NotNull
private String lastName;

但是,当我在单元测试中运行此验证时:

@Test
public void testEmployerIdCanOnlyBeSetWhenCreating() {
    EmployeeDTO dto = new EmployeeDTO();

    ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
    Set<ConstraintViolation<EmployeeDTO>> violations = vf.getValidator().validate(dto, EmployeeDTO.ValidatedOnCreationOnly.class);

    assertEquals(violations.size(), 3);
}

事实证明,所有非组注释验证都被忽略,我只得到1次违规。

我可以理解这种行为,但我想知道是否有一种方法可以使该组包含所有非注释参数。如果不是,我必须做这样的事情:

public interface AlwaysValidated {
}

public interface ValidatedOnCreationOnly extends AlwaysValidated {
}

@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255, groups = AlwaysValidated.class)
@NotNull(groups = AlwaysValidated.class)
private String firstName;
@Length(max = 255, groups = AlwaysValidated.class)
@NotNull(groups = AlwaysValidated.class)
private String lastName;

我正在使用的真正的类有更多的字段(大约20个),所以这种方法转变为一种明确的方式,将验证指示为一大堆。

任何人都可以告诉我是否有更好的方法?也许是这样的:

vf.getValidator().validate(dto, EmployeeDTO.ValidatedOnCreationOnly.class, NonGroupSpecific.class);

我在一个春季项目中使用它,所以如果春天有另一种方式,我会很高兴知道。

java spring validation bean-validation
2个回答
21
投票

Default中有一个javax.validation.groups.Default组,它代表默认的Bean Validation组。除非明确定义组列表:

  • 约束属于Default
  • 验证适用于Default

你可以扩展这个组:

public interface ValidatedOnCreationOnly extends Default {}

1
投票

只是想添加更多:

如果你使用的是spring框架,你可以使用org.springframework.validation.Validator

@Autowired
private Validator validator;

并手动执行验证:

validator.validate(myObject, ValidationErrorsToException.getInstance());

在控制器中:

@RequestMapping(method = RequestMethod.POST)
public Callable<ResultObject> post(@RequestBody @Validated(MyObject.CustomGroup.class) MyObject request) {
    // logic
}

虽然以这种方式从javax.validation.groups.Default延伸将无法工作,所以你必须在组中包括Default.class

class MyObject {

    @NotNull(groups = {Default.class, CustomGroup.class})
    private String id;

    public interface CustomGroup extends Default {}
}
© www.soinside.com 2019 - 2024. All rights reserved.