2017-06-13 177 views
0

我用Spring Boot構建了一個REST服務。在一個請求方法中,我正在使用Hibernate驗證器驗證傳入請求與我已註釋驗證(@NotNull等)的Object。對於剩下的端點的代碼看起來是這樣的:將類名稱作爲參數傳遞給方法

@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 

我想驗證錯誤消息的創建移到它的梅託德自己是這樣的:

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

隨着代碼現在我得到以下錯誤Unknow class: validateClassSet<ConstraintViolation<validatedClass>>。如何將Class名稱(在本例中爲ParameterDateRequest)作爲參數傳遞給方法?

更新: 我manged傳遞ClassClass<?> clazz。我也意識到,我需要通過對象作爲一個對象,但我得到這個錯誤:

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

回答

0

您可以泛型化的方法:

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

這將確保您的Class<?>令牌和你Object有匹配類型。

然後傳遞參數這樣:

validator.validate(model, clazz) 

注意我可能是誤讀錯誤(我無法找到一個validator的javadoc),所以它也可能是validator有講座級別通用(例如Validator<MyType>)。如果是這種情況,那麼您傳遞給validator#validateT/Object必須與Validator的類型匹配,但第二個參數似乎接受任何類型(Class<?>)。你也不需要生成方法,你只需要匹配驗證器的類型。

相關問題