在此应用程序中,有几个来自用户输入的实体,在处理之前必须对其进行验证。
我需要一个可用于多个实体的验证注释和验证器。
一个示例是提供者和处理程序。一些实体具有提供者和处理程序代码字段。验证应检查给定的处理程序代码是否与给定的提供程序代码兼容。这些字段在所有实体上的命名都不同,甚至为使用不同名称的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不兼容!
有人可以提供代码段吗?