Hibernate验证自定义消息解析

时间:2019-03-18 09:31:37

标签: java validation hibernate-validator

在此应用程序中,有几个来自用户输入的实体,在处理之前必须对其进行验证。

我需要一个可用于多个实体的验证注释和验证器。

一个示例是提供者和处理程序。一些实体具有提供者和处理程序代码字段。验证应检查给定的处理程序代码是否与给定的提供程序代码兼容。这些字段在所有实体上的命名都不同,甚至为使用不同名称的json处理进行了注释。

因此,我需要这样的东西:

@HandlerProviderValid(handlerJsonProperty = "handler_code", providerJsonProperty = "provider_code", message = "{handler_provider_invalid}")
public class Package {

    @JsonProperty("handler_code")
    private String hCode;

    @JsonProperty("provider_code")
    private String pCode;

}


@Retention(RUNTIME)
@Target({ TYPE })
@Constraint(validatedBy = HandlerProviderValidator.class)
public @interface HandlerProviderValid {
    String message();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    String handlerJsonProperty();

    String providerJsonProperty();
}



public class HandlerProviderValidator implements ConstraintValidator<HandlerProviderValid, Object> {

    private String handlerJsonProperty;
    private String providerJsonProperty;
    private String message;

    @Override
    public void initialize(HandlerProviderValid constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);

        handlerJsonProperty = constraintAnnotation.handlerJsonProperty();
        providerJsonProperty = constraintAnnotation.providerJsonProperty();
        message = constraintAnnotation.message();
    }

    @Override
    public boolean isValid(Object validatedObject, ConstraintValidatorContext context) {
        String handlerCode = ReflectiveUtils.findAnnotatedString(handlerJsonProperty);
        String providerCode = ReflectiveUtils.findAnnotatedString(providerJsonProperty);

        if (!isHandlerProviderCompatible(handlerCode, providerCode)) {
            context.disableDefaultConstraintViolation();

            // I assume here I should handle parameters into the message?
            context.buildConstraintViolationWithTemplate(message).addConstraintViolation();

            return false;
        }

        return true;
    }

}

属性文件:

handler_provider_invalid=Given handler code ${handler_code} is incompatible with given provider code ${provider_code}!

问题是: 如何在此示例消息中解析$ {handler_code}和$ {provider_code}占位符?目的是向用户显示输入的错误。

给定处理程序代码AS与给定的提供程序代码TL不兼容!

有人可以提供代码段吗?

0 个答案:

没有答案