将 Class 名称作为参数传递给方法
Passing Class Name as Argument to Method
我已经用 Spring Boot 构建了一个 REST 服务。在一种请求方法中,我正在使用 Hibernate Validator 验证传入请求与我已注释以进行验证(@NotNull
等)的 Object
。 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;
}
使用现在的代码,Set<ConstraintViolation<validatedClass>>
出现以下错误 Unknow class: validateClass
。如何将 Class
名称(在本例中为 ParameterDateRequest
作为参数传递给方法?
更新:
我设法将 Class
作为 Class<?> clazz
传递。我还意识到我需要将对象作为对象传递,但出现此错误:
validate (T, Class<?>...) in Validator cannot be applied
to (java.lang.Object)
reason: Incompatible equality constraint: ? and T
您可以生成您的方法:
public <T> List<ObjectValidationErrorMessage> getErrorMessages(Class<T> clazz, T model) {
这将确保您的 Class<?>
令牌和您的 Object
具有匹配的类型。
然后像这样传递参数:
validator.validate(model, clazz)
请注意,我 可能 误读了错误(我找不到 validator
的 javadoc),所以 validator
也有可能class 级泛型(例如 Validator<MyType>
)。如果是这样,那么你传递给 validator#validate
的 T
/Object
必须匹配 Validator
的类型,但第二个参数似乎接受任何 class类型(Class<?>
)。您也不需要对方法进行泛化,您只需要匹配验证器的类型即可。
我已经用 Spring Boot 构建了一个 REST 服务。在一种请求方法中,我正在使用 Hibernate Validator 验证传入请求与我已注释以进行验证(@NotNull
等)的 Object
。 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;
}
使用现在的代码,Set<ConstraintViolation<validatedClass>>
出现以下错误 Unknow class: validateClass
。如何将 Class
名称(在本例中为 ParameterDateRequest
作为参数传递给方法?
更新:
我设法将 Class
作为 Class<?> clazz
传递。我还意识到我需要将对象作为对象传递,但出现此错误:
validate (T, Class<?>...) in Validator cannot be applied
to (java.lang.Object)
reason: Incompatible equality constraint: ? and T
您可以生成您的方法:
public <T> List<ObjectValidationErrorMessage> getErrorMessages(Class<T> clazz, T model) {
这将确保您的 Class<?>
令牌和您的 Object
具有匹配的类型。
然后像这样传递参数:
validator.validate(model, clazz)
请注意,我 可能 误读了错误(我找不到 validator
的 javadoc),所以 validator
也有可能class 级泛型(例如 Validator<MyType>
)。如果是这样,那么你传递给 validator#validate
的 T
/Object
必须匹配 Validator
的类型,但第二个参数似乎接受任何 class类型(Class<?>
)。您也不需要对方法进行泛化,您只需要匹配验证器的类型即可。