当前位置: 首页 > 面试题库 >

您可以在运行时更改注释消息吗?

韩高峯
2023-03-14
问题内容

我试图在注释中包含一条动态消息,该消息根据传递给它的其他变量中的值来更改文本的主体。我设置了默认消息,但是当设置了某个指示器时,我想显示其他消息。这可能吗?

这是我的注释-

@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";
    }

问题答案:

这是我能够执行此操作的方式-

@Override
public void initialize(FieldMatch constraintAnnotation)
{
    firstFieldName = constraintAnnotation.first();
    secondFieldName = constraintAnnotation.second();
    thirdFieldName = constraintAnnotation.third();
    match = constraintAnnotation.match();

    //set a message variable on initialization    
    if("true".equals(match)){
        message = constraintAnnotation.message();
    }
    else{
        message = "{password.error.threeQuestionsSameAnswer}";}
}

@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context)
{
    Object firstObj = null;
    Object secondObj = null;
    Object thirdObj = null;

    //disable existing violation message
    context.disableDefaultConstraintViolation();
    //build new violation message and add it
    context.buildConstraintViolationWithTemplate(message).addConstraintViolation();

etc.........
}


 类似资料:
  • 问题内容: 对于拥有ejb经验的人来说,这可能是一个愚蠢的问题。 我想动态地读取和更改我的其中一个通过注释使用Java EE调度程序的EJB Bean的分钟参数。有人知道如何在运行时执行此操作,而不是像在下面的类中对其进行硬编码?如果我要以编程方式进行操作,是否仍可以使用注释? 问题答案: 用于容器在部署期间创建的自动计时器。 另一方面,可以使用它允许您在运行时定义何时应调用该方法。 这可能是您感

  • 问题内容: 是否可以通过在指令范围内传递值来即时更改templateUrl?我想将数据传递到控制器,该控制器将根据从指令传递的数据来呈现页面 可能看起来像这样: 问题答案: 有可能,但是当要加载的模板取决于某些范围数据时,您将无法再使用指令的属性,并且您将不得不使用较低级别的API,即和。 大约需要做的事情(仅在链接功能中是可能的)是使用(不要忘了参与!)检索模板的内容,然后“手动”编译模板的内容

  • 问题内容: 我想知道是否可以在运行时设置注释变量? 问题答案: 不,那不可能。 注释以常量值的形式存储在类文件中,并且无法在运行时进行计算。 您能做的最好的事情就是存储有关如何计算值的某种“指令”。 例如,您可以使用某种脚本语言存储一个简单的表达式,然后在读取注释值时执行该表达式,或者可以指定要获取真实值的调用方法的名称。

  • 问题内容: 而且我正在尝试更改方法注释,但是java.lang.reflect.Method不包含任何地图字段(例如“ annotations”)或方法(例如“ getDeclaredAnnotationMap”) 只有但是我可以用这个字节数组做什么? 那么,如何修改方法的注释呢? 编辑: 我创建了:http : //pastebin.com/T2rewcwU 但是,仅编辑此方法实例,如果取消注释

  • 为下面的代码生成的字节代码在类中创建一个字段。当为可变字段赋值时,原始委托不会更改。 有没有一种方法可以在运行时更改委托,同时保持实现? 该示例取自https://kotlinlang.org/docs/reference/delegation.html文档并经过编辑。

  • 众所周知,Storm拓扑可以有多个喷口/螺栓。当我们发布Storm拓扑时,我们必须定义喷口和螺栓之间的依赖关系。我想知道我可以在拓扑运行时注册新螺栓吗?