2017-02-23 9 views
0

私は、Beanを表すJSONドキュメントのPUTを受け入れるdropwizardサービスを持っています。私はBeanの実装で制約アノテーションを使用し、リソースメソッドで@Validアノテーションを使用します。Dropwizardとオブジェクトのリストの検証

すべてがうまく機能します。

ここで、の配列をJSONに渡したいとします。私は単に

@PUT 
public Response write(@Valid List<MyBean> beans); 

にメソッドのシグネチャを変更し、それは一般的に動作しますが、検証エラーがある場合、その応答は非常にユーザーフレンドリーではありません。私は、アレイ内の100の豆に投稿して、それらのは、「名前」プロパティを欠落している場合たとえば、その後、応答は要求の中 Beanがありの兆候なし

{"errors":["name may not be empty"]} 

です問題。

これを克服する方法はありますか?

私はこのすべてを自分で処理できるように、Resourceクラスでバリデーターを取得する方法はありますか?

答えて

0

これはできない可能性があります。ここでは、スタンドアロン何が起こっているかのテストとどのようにあなたがそれにフックするためのようなウォールド休止状態である:

public class ListBeanValidationTest { 

    public static void main(String[] args) { 
     List<Bean> asList = Arrays.asList(new Bean("test"), new Bean("test2")); 

     Validator v = Validators.newConfiguration().messageInterpolator(new MsgInterpolator()).buildValidatorFactory().getValidator(); 

     // this is what DW does but i am lazy so you get the main version 
     if(asList instanceof Iterable) { 
      Iterable values = (Iterable) asList; 
      Set<ConstraintViolation<Object>> violations = new HashSet<>(); 
      for(Object value : values) { 
       violations.addAll(v.validate(value)); 
      } 

      violations.forEach(System.out::println); 
     } 
    } 

    public static class Bean { 

     Bean(String name) { 
      this.name = name; 
     } 

     String name; 

     @NotEmpty(message="bean not empty ${name}") 
     String wrong; 
    } 

    public static class MsgInterpolator implements MessageInterpolator { 

     @Override 
     public String interpolate(String messageTemplate, Context context) { 
      return interpolate(messageTemplate, context, Locale.getDefault()); 
     } 

     @Override 
     public String interpolate(String messageTemplate, Context context, Locale locale) { 
      Object validatedValue = context.getValidatedValue(); 


      return null; 
     } 

    } 
} 

MessageInterpolatorはここに問題です。それはあなたのためにメッセージを補間している時点でBeanのインスタンスを持っていないので、悲しいことに、その参照を使用することはできません。つまり、別の方法でこれを行う必要があります。

validatorへの参照を取得することができます(これはDW環境で見つけることができます)。GuiceでDIを使用しています)。

これをDWの方法で実行したい場合は、次のように拡張することができます。 - これはDWリソースの検証を行うクラスです。 (私は自分自身をそれをやってしまった - アルトゥル

+0

おかげ - https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-custom-message-interpolation

私はそれはあなたがここにもあなたに利用可能な検証のオプションにまで読むことができます

を役に立てば幸いバリデーターを注入するのが難しいと思った理由は分かりません) –

+0

それは良い追加だろうかと思います。あなたの検証メッセージが同じBeanの別のプロパティに依存している場合は、それをどのように検証しますか? Bean全体がNullになるまでの依存性検証が行われ、メッセージ補間器がNPEになり、どちらが本当にうまくいかないかを検証します。私はそれがこれをしていないという背後にある彼らのモチベーションだと思います。また、Hibernateの検証はリストや配列をデフォルトでサポートしていないため、これは決して問題にならなかったかもしれません。 DWはそれ自体をハックする:) – pandaadb

関連する問題