【发布时间】:2011-05-18 17:21:26
【问题描述】:
我试图在我的注释中包含一条动态消息,该消息根据传递给它的其他变量中的值更改文本的主体。我设置了默认消息,但是当设置了某个指标时,我想显示不同的消息。这可能吗?
这是我的注释 -
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch
{
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String first();
String second();
String third() default "";
String match() default "true";
String message() default "{error.theseValuesDontMatch}";
/**
* Defines several <code>@FieldMatch</code> annotations on the same element
*
* @see FieldMatch
*/
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented @interface List
{
FieldMatch[] value();
}
}
这是注解使用的验证器类 -
public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object>
{
private String firstFieldName;
private String secondFieldName;
private String thirdFieldName;
private String match;
private String message;
@Override
public void initialize(FieldMatch constraintAnnotation)
{
firstFieldName = constraintAnnotation.first();
secondFieldName = constraintAnnotation.second();
thirdFieldName = constraintAnnotation.third();
match = constraintAnnotation.match();
if(match != null && !Boolean.getBoolean(match)){
message = "error.theseValuesMustNotMatch";
}
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context)
{
try
{
final Object firstObj = BeanUtils.getProperty(value, firstFieldName);
final Object secondObj = BeanUtils.getProperty(value, secondFieldName);
final Object thirdObj = BeanUtils.getProperty(value, thirdFieldName);
final String same = BeanUtils.getProperty(value, match);
boolean valid = false;
if(same != null && Boolean.getBoolean(same)){
if("".equals(thirdObj)){
valid = firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj) ;
}
else{
valid = firstObj != null && firstObj.equals(secondObj) && firstObj.equals(thirdObj) ;
}
}
else{
if("".equals(thirdObj)){
valid = firstObj == null && secondObj == null || firstObj != null && !firstObj.equals(secondObj) ;
}
else{
valid = firstObj != null && !(firstObj.equals(secondObj) && firstObj.equals(thirdObj)) ;
}
}
return valid ;
}
catch (final Exception ignore)
{
// ignore
}
return true;
}
}
我最感兴趣的部分是读取的代码 -
if(match != null && !Boolean.getBoolean(match)){
message = "password.error.theseValuesMustNotMatch";
}
【问题讨论】:
-
你为什么要这样做?这将有助于了解您要实现的目标...
-
我想避免为一些可以很容易地完成的事情创建两个注释,除了不同的消息。检查以确保匹配字段和检查以确保不匹配字段之间的注释之间的差异非常小。
标签: java bean-validation