将类名称作为参数传递给方法

时间:2017-06-13 18:31:19

标签: java hibernate-validator

我使用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

1 个答案:

答案 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}})。您也不需要同化该方法,您只需要匹配验证器的类型。