我使用Spring Boot构建了一个REST服务。在一种请求方法中,我使用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
我想将验证错误消息的创建移到它自己的方法中:
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: validateClass
收到以下错误Set<ConstraintViolation<validatedClass>>
。如何将Class
名称ParameterDateRequest
作为参数传递给方法?
更新
我设法将Class
作为Class<?> clazz
传递给我。我也意识到我需要将Object作为对象传递但是我得到了这个错误:
validate (T, Class<?>...) in Validator cannot be applied
to (java.lang.Object)
reason: Incompatible equality constraint: ? and T
答案 0 :(得分:0)
您可以对您的方法进行一致化:
gevent=1000
http-websockets=true
这将确保您的public <T> List<ObjectValidationErrorMessage> getErrorMessages(Class<T> clazz, T model) {
令牌和Class<?>
具有匹配类型。
然后传递参数:
Object
注意我可以误读错误(我找不到validator.validate(model, clazz)
的javadoc),所以validator
也可能有类级通用(例如validator
)。如果是这种情况,则传递给Validator<MyType>
的{{1}} / T
必须与Object
的类型匹配,但第二个参数似乎接受任何classtype({{ 1}})。您也不需要同化该方法,您只需要匹配验证器的类型。