JSR-303検証アノテーションが付けられたフィールドがたくさんあるBeanがあります。フィールドの1つが必須であるという新しい要件がありますが、これは特定の条件でのみです。
私は周りを見回して、必要なもの、検証グループを見つけました。
これは私が今持っているものです:
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);
私はこれを春のプロジェクトで使用しているので、春に別の方法がある場合は喜んで知っています。
javax.validation.groups.Default
にはDefault
グループがあり、これはデフォルトのBeanValidationグループを表します。グループのリストが明示的に定義されていない限り:
Default
グループに属しますDefault
グループに適用されますこのグループを拡張できます。
public interface ValidatedOnCreationOnly extends Default {}
さらに追加したかっただけです:
spring Frameworkを使用している場合は、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 {}
}