Подтвердить что ты не робот

JSF: JSR 303 Bean Валидация - почему на геттере и не сеттер?

Я не понимаю, почему JSR 303 (bean валидация) используется для методов getter, а не для сеттера? Разве не логичнее поставить его под метод setter, так как это точка входа в поле и проверка должна быть проверена до этого?

4b9b3361

Ответ 1

Аннотирование геттеров не означает, что проверка выполняется, когда вызывается геттер. Он просто используется для определения свойства, к которому применяется ограничение.

Большое преимущество размещения ограничений (обычно открытых) геттеров вместо (обычно частных) полей заключается в том, что ограничения являются частью публичного API типа таким образом. Они будут добавлены в сгенерированный JavaDoc. Пользователь типа знает тот способ, какие ограничения применяются к нему, не заглядывая в его внутреннюю реализацию.

Еще одно преимущество аннотирования геттеров заключается в том, что ограничения могут быть применены к методам базовых классов или интерфейсов, а также применяются для любых подтипов/реализаций.

Ответ 2

Это очень хороший вопрос и то, на что я никогда не обращал внимания. Но я думаю, что знаю ответ (а также почему я никогда не получал этот вопрос сам).

Если вы смотрите на это, с точки зрения того, что аннотация определяет, где будет выполняться валидация, тогда ее использование на геттере не имеет смысла. (почему бы не утверждать при сохранении самого значения..). Но это не так, как это работает...

Программисту необходимо указать структуру проверки, свойства которой должны быть проверены. Таким образом, вы можете поместить аннотацию непосредственно в атрибут (который я предпочитаю), или вы можете поместить его на геттер. Оба они означают операцию чтения. Framework должен прочитать все атрибуты вашего класса, которые должны быть проверены. Таким образом, в этом случае установка сеттера вообще не имеет смысла. Ключом к пониманию является перспектива...

Надеюсь, это имеет смысл.

Ответ 3

Рассмотрим этот код:

public class BeanValidation {

    private int nameSetCount = 0;
    private int nameGetCount = 0;
    private String name;

    public String getName() {
        this.nameGetCount++;
        return name;
    }

    public void setName(String name) {
        this.nameSetCount++;
        this.name = name;
    }

}

Поместите аннотацию поверх private String name;

Аннотации идентифицируют поле легко, просто просматривая поле .

Поместите аннотацию поверх public String getName()

Аннотации идентифицируют поле легко, просто глядя на возвращенное поле.

Поместите аннотацию поверх public void setName(String name)

Аннотация не может определить поле, смотрящее на измененное поле, потому что может быть более одного.