web-dev-qa-db-ja.com

JSR-303検証グループはデフォルトグループを定義します

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);

私はこれを春のプロジェクトで使用しているので、春に別の方法がある場合は喜んで知っています。

18
geoffreydv

javax.validation.groups.DefaultにはDefaultグループがあり、これはデフォルトのBeanValidationグループを表します。グループのリストが明示的に定義されていない限り:

  • 制約はDefaultグループに属します
  • 検証はDefaultグループに適用されます

このグループを拡張できます。

public interface ValidatedOnCreationOnly extends Default {}
28
Ali Dehghani

さらに追加したかっただけです:

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 {}
}
2
dubious cyborg