2017-06-13 14 views
0

私はSpring BootでRESTサービスを構築しました。 1つのリクエストメソッドでは、着信リクエストと、Hibernate Validatorを使用して検証用に注釈を付けたObject@NotNullなど)との比較を検証しています。 RESTエンドポイントのコードは次のようになります。メソッドへの引数としてクラス名を渡す

@GetMapping(value = "/parameter-dates") 
    public ResponseEntity getParameterDates(ParameterDateRequest parameterDateRequest) { 

     Set<ConstraintViolation<ParameterDateRequest>> inputErrors = validator.validate(parameterDateRequest); 

     if (!inputErrors.isEmpty()) { 

      objectValidationErrorMessages = new ArrayList<>(); 
      for (ConstraintViolation<ParameterDateRequest> constraintViolation : inputErrors) { 
       objectValidationErrorMessage = new ObjectValidationErrorMessage(); 
       log.info("Error for user: " + loggedInUser.getUserEmail() + 
         " field: " + constraintViolation.getPropertyPath() + " with value: " + parameterDate.getParameterDateUnadjusted() + 
         " has error: " + constraintViolation.getMessage()); 
       objectValidationErrorMessage.setFieldWithError(constraintViolation.getPropertyPath().toString()); 
       objectValidationErrorMessage.setErrorMessage(constraintViolation.getMessage()); 
       objectValidationErrorMessages.add(objectValidationErrorMessage); 
      } 

      return (new ResponseEntity(objectValidationErrorMessages, headers, HttpStatus.BAD_REQUEST)); 

     } 
//The rest of the code that is used when there is not validation errors 

私はそれのmetodに検証エラーメッセージの作成を移動したいと思い、このように所有しています:などのコードで

public List<ObjectValidationErrorMessage> getErrorMessages(Class<?> clazz, Object model) { 

     List<ObjectValidationErrorMessage> objectValidationErrorMessages = new ArrayList<>(); 
     Set<ConstraintViolation<?>> inputErrors = validator.validate(model); 

     if (!inputErrors.isEmpty()) { 
      for (ConstraintViolation<?> constraintViolation : inputErrors) { 
       objectValidationErrorMessage = new ObjectValidationErrorMessage(); 
       objectValidationErrorMessage.setFieldWithError(constraintViolation.getPropertyPath().toString()); 
       objectValidationErrorMessage.setErrorMessage(constraintViolation.getMessage()); 
       objectValidationErrorMessages.add(objectValidationErrorMessage); 
      } 
     } 
     return objectValidationErrorMessages; 
    } 

を今度はSet<ConstraintViolation<validatedClass>>の次のエラーUnknow class: validateClassが表示されます。 Classの名前をこのメソッドの引数としてParameterDateRequestに渡すにはどうすればよいですか?

更新: 私はClass<?> clazzとしてClassを渡すことがうまく管理。

validate (T, Class<?>...) in Validator cannot be applied 
to (java.lang.Object)  
reason: Incompatible equality constraint: ? and T 

答えて

0

あなたの方法をgenerifyすることができます:

public <T> List<ObjectValidationErrorMessage> getErrorMessages(Class<T> clazz, T model) { 

これはあなたのClass<?>トークンとあなたのObjectを持っていることを保証しますまた、私はオブジェクトとして渡す必要がありますが、私はこのエラーを取得することを実現しましたマッチングタイプ。私は(私はvalidatorのJavadocを見つけることができませんでした)エラーを誤読することができ、それがvalidatorはクラス - を持っていることも可能です

validator.validate(model, clazz) 

注:

その後のような引数を渡しますレベルの汎用(例:Validator<MyType>)。その場合は、のタイプと一致する必要がありますが、2番目のパラメータは任意のクラスタイプ(Class<?>)を受け入れているようです。T/Objectvalidator#validateに渡す必要があります。また、メソッドも同様に生成する必要はありません。バリデータの型を一致させるだけで済みます。

関連する問題