2016-02-12 99 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 {} 
}