2016-02-12 97 views
4

我有一个bean,它有很多用JSR-303验证注释标注的字段。现在有一个新的要求,即其中一个字段是强制性的,但仅限于某些条件。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); 

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

回答

9

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

  • 约束属于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 {} 
}