将 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#validateT/Object 必须匹配 Validator 的类型,但第二个参数似乎接受任何 class类型(Class<?>)。您也不需要对方法进行泛化,您只需要匹配验证器的类型即可。