0

カスタムクラスのバリデータからグループを使用して:私たちは、検証する必要があるJSR303の検証 - 私たちはそうなどの分野が含まれ、かなり貧弱構築豆持っているユースケース持って

public class DataBean { 
    private boolean flag1; 
    private boolean flag2; 

    private String phone1; 
    private String address1; 
    private String city1; 
    private String state1; 

    private String phone2; 
    private String address2; 
    private String city2; 
    private String state2; 
} 

を携帯電話/住所/都市/ state [1 | 2]はフラグ[1 | 2]が真である場合のみです。悪い、悪いデザイン、付与されます。私たちのビジネス・ロジックどこで

public class DataBean { 
    private boolean flag1; 
    private boolean flag2; 

    @NotNull(groups = Info.First.class) 
    private String phone1; 
    @NotNull(groups = Info.First.class) 
    private String address1; 
    @NotNull(groups = Info.First.class) 
    private String city1; 
    @NotNull(groups = Info.First.class) 
    private String state1; 

    @NotNull(groups = Info.Second.class) 
    private String phone2; 
    @NotNull(groups = Info.Second.class) 
    private String address2; 
    @NotNull(groups = Info.Second.class) 
    private String city2; 
    @NotNull(groups = Info.Second.class) 
    private String state2; 
} 

当社の現在の戦略はそうのように、「本物」のデータフィールドのそれぞれに@NotNull(または任意の検証我々が必要)を使用して、グループインジケータを使用することですこのBean( "default"検証グループによって検証される他のさまざまなフィールドがある)を検証しているとき、 "default"グループの違反を取得し、flag1が真であるかどうかを確認します。 Info.First.class、flag2がtrueであるかどうかを確認し、Info.Second.classの検証を実行します。

ここで、カスタムクラスバリデータからこれらのグループにフックする方法はありますか?私は、flag1/flag2プロパティとそれに対応するカスタムグループを取るクラスバリデーターを持つことを想定しています。そして、isValidが呼び出されると、これらの2次/ 3次呼び出しをグループに対して行います。目的は、カスタムクラスのバリデーターがデフォルトグループにあることです。したがって、このクラスを検証するビジネスロジックは、バリデーションを個別に呼び出す必要がないため、この醜いレガシーデザインリークの詳細は持ちません。

思考?ありがとう!

答えて

0

私はあなたが解決しようとしている問題を把握していません。私の解釈は、各検証グループに対して明示的に別々の呼び出しを行うのを避けようとしていますが、フラグにしたがって2つの非デフォルトグループを呼び出します。いくつかのグループシーケンスを定義し、フラグの代わりにこれらを使用することはできませんか?グループシーケンスは、グループと同じ方法で使用されます。彼らの唯一のことは、あるグループが失敗した場合にグループの検証をやめることです。

フラグに基づいてすべてのグループを常に検証する必要がある場合、カスタムクラスバリデーターはinitializeメソッドに渡される制約注釈でgroups()を呼び出すことができます。

+0

私はグループ系列を調査していないが、私はそれをチェックアウトします。ありがとうございました。 – bruth

+1

[グループシーケンス](http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#d0e968) – Will

0

クラスレベルのバリデータを作成し、内部のバリデータを初期化します。次に、各フィールドに制約例外を追加することによって、クラスレベル制約の主要な有効なメソッド内のグループごとにオブジェクトを検証できます。以下を参照してください:

制約インタフェース:

@Documented 
@Constraint(validatedBy = {DataBeanValidator.class}) 
@Target({METHOD, FIELD, ANNOTATION_TYPE, TYPE}) 
@Retention(RUNTIME) 
public @interface DataBeanConstraint { 

    String message() default "validation.dataBean"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 
} 

バリ:

public class DataBeanValidator implements ConstraintValidator<DataBeanConstraint, DataBean> { 

    private Validator validator; 

    @Override 
    public void initialize(DataBeanConstraint constraintAnnotation) { 
     ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
     validator = factory.getValidator(); 
    } 

    @Override 
    public boolean isValid(BeanData beanData, ConstraintValidatorContext context) { 
     if (beanData == null) { 
      return true; 
     } 
     if (beanData.isFlag1) { 
      Set<ConstraintViolation<DataBean>> constraintViolations = validator.validate(beanData, Info.First.class); 
      if (constraintViolations != null) { 
       for (ConstraintViolation<BeanData> constraintViolation : constraintViolations) { 
        context.disableDefaultConstraintViolation(); 
        context.buildConstraintViolationWithTemplate("required field"). 
          addNode(constraintViolation.getPropertyPath().toString()) 
          .addConstraintViolation(); 
       } 
      } 
     } 

    } 
} 

クラスレベルのバリデータ:

@DataBeanConstraint 
public class DataBean { 
    private boolean flag1; 
    private boolean flag2; 

    @NotNull(groups = Info.First.class) 
    private String phone1; 
    @NotNull(groups = Info.First.class) 
    private String address1; 
    @NotNull(groups = Info.First.class) 
    private String city1; 
    @NotNull(groups = Info.First.class) 
    private String state1; 

    @NotNull(groups = Info.Second.class) 
    private String phone2; 
    @NotNull(groups = Info.Second.class) 
    private String address2; 
    @NotNull(groups = Info.Second.class) 
    private String city2; 
    @NotNull(groups = Info.Second.class) 
    private String state2; 
} 
関連する問題