是否可以使用单个(最好是基于Spring的)自定义注释返回多个/可变错误消息?

时间:2011-06-03 18:30:50

标签: spring validation annotations message

我目前正在使用Spring进行所有验证,但是想要构建一个自定义注释,将单个字段上的一些条件组合在一起,有条件地验证其中一些条件并使用变量值,即某些内容。 :

public @interface CustomAnno
{
    @NotNull
    @Length(min = 1, max = 10, applyIf = "condition == 1")
    @Length(min = 11, max = 20, applyIf = "condition == 2")
    String val();
    int condition();
}

我知道这在语法上并不正确,但希望能够解决我想要做的事情。

我的问题是,上述内容是否可能,并且单个CustomAnno注释是否能够为失败的所有条件返回错误,而不是仅返回CustomAnno的单个失败?

编辑:我可能不一定使用Spring注释来驱动值的验证。理想情况下,我将在处理CustomAnno的ConstraintValidator中使用任意验证逻辑,如果我的理解正确,则只会在isValid调用中返回true或false以查找一个可能的错误。我实际需要的是实现与上述相同功能的东西,但是使用来自验证器的注释或自定义逻辑,即:

public class CustomAnnoValidator implements ConstraintValidator<CustomAnno,String>
{
    @NotNull
    String val;
    int cond;
    String regex;
    List<String> errors;

    private void err(String msg)
    {
        errors.add(msg);
    }

    public void initialize(CustomAnno anno)
    {
        this.val = anno.val();
        this.cond = anno.condition();
        this.errors = new ArrayList<String>();
        this.regex = "[A-Za-z]+[A-Za-z0-9]+";
    }

    public boolean isValid(String object, ConstraintValidatorContext constraintContext)
    {
        if (cond == 1)
        {
            if (object.length() > 10)
                err("Length must be less than 10");
            else if (object.length() < 1)
                err("Length must be greater than 1");
        }
        else if (cond == 2)
        {
            if (object.length() > 21)
                err("Length must be less than 21");
            else if (object.length() < 10)
                err("Length must be greater than 10");
        }

        if (!val.matches(regex))
            err("Must start with an alpha character and consist of only alphanumeric characters.");

        // some method to add the error messages, ie => constraintContext.addErrors(errors);

        return errors.size() > 0;
    }
}

我想理论上我可以为我缺少的任何单一条件创建自定义注释,可能会使这个问题变得清晰,但是想知道验证器是否有可能处理多个条件

1 个答案:

答案 0 :(得分:0)

我不确定Spring注释的含义是什么意思? Spring MVC旨在与JSR-303一起使用,这是javax.validation jars描述的内容。

Spring MVC验证应该为每个失败的验证返回错误消息,即使这些验证在一个自定义注释中组合在一起。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/validation.html