Возможно ли возвращать сообщения об ошибках с несколькими / переменными значениями с помощью одной (предпочтительно на основе Spring) пользовательской аннотации?

#spring #validation #annotations #message

#spring #проверка #аннотации #Сообщение

Вопрос:

В настоящее время я использую 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 для проверки значения. В идеале я бы использовал произвольную логику проверки в ConstraintValidator, который обрабатывает CustomAnno, который, если я правильно понимаю, вернет true или false только для одной возможной ошибки в вызове isValid . На самом деле я ищу что-то, что обеспечивает ту же функциональность, что и выше, но либо с аннотациями, либо с пользовательской логикой из средства проверки, т.Е.:

 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:

Я не уверен, что вы подразумеваете под аннотациями Spring? Spring MVC разработан для работы с JSR-303, что и описывается в этих javax.validation jar.

Проверка Spring MVC должна возвращать сообщения об ошибках для каждой неудачной проверки, даже если эти проверки сгруппированы вместе в одной пользовательской аннотации.

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

Комментарии:

1. Э, извините, комментарий о jar (и сам вопрос, на самом деле) был не таким ясным, как следовало бы. Я хочу применять аннотации на основе условий во время выполнения, которые Spring выполняет с помощью команд applyIf, однако, насколько я видел, JSR-303 не обрабатываются. В идеале я хотел бы определить, какие условия применять во время выполнения, а затем применить их, но аннотации Spring не могут быть помещены в определение самого @interface, и я не уверен, действуют ли они так, как я хочу, если они помещены в объявления методов, как я сделал в CustomAnno.

2. О, а также вы не можете использовать 2 одинаковых аннотации к объекту, что также затрудняет их условное использование (хотя я могу вроде как обойти такие вещи, как ограничения длины, используя min / max / size / length / value).

3. @Tommy. Понял. Условная проверка с помощью JSR не существует. Однако вы можете сгруппировать аннотации вместе, и Spring все равно будет заполнять сообщения об ошибках для каждого сбоя в группе. Что касается нескольких условий, я думаю, вы сами по себе, хотя эту функцию стоит предложить.