2016-10-21 2 views
1

Просто столкнулся с ошибкой, где проблема была, что я имел:@NotNull ограничение для примитивов, почему?

@Column(name = "ACTIVE") 
@NotNull 
private boolean active; 

В моем коде я забыл установить значение, но она по-прежнему «работает», как по умолчанию логического значения ложно. Теперь я изменил его на Boolean, чтобы он не прошел проверку, если он не активно установлен.

Почему я могу иметь @NotNull ограничения на вещи, которые, очевидно, не могут быть null? Является ли это рефакторингом, поэтому, если я перехожу к Boolean, как я это сделал сейчас, я все еще сохраняю предполагаемое ограничение?

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

+2

Поскольку создание базы данных из схемы, объявленной аннотациями, должно знать, что столбец будет не нулевым. Позже вы можете перейти от 'boolean' к любому типу, который boolean может преобразовать в и является нулевым (не только логическим, но и интегральным, например Short/Integer/и т. Д.). Например, mysql выделяет и весь 'tinyint' (' int8_t') для bool. –

+1

JavaDoc 'javax.validation.constraints.NotNull' явно заявляет, что он принимает любой тип, и не имеет большого смысла не делать этого. Единственная цель этой аннотации - проверить, не является ли аннотированная переменная не нулевой. Проверка того, разрешает ли тип «null» или нет, уже не приведет к принципу единой ответственности. – Tom

+0

@AdrianColomitchi, спасибо, я думаю, что это очень актуальная точка. Я лично не использую эту функцию, но могу понять, почему это важно. –

ответ

1

Как javadoc говорит Аннотированный элемент не должен быть пустым. Принимает любой тип.

Это может быть любой тип он просто проверяет, является ли переменная not null или нет, это не имеет ничего общего с, принимает ли он null или нет.

Как уже упоминалось, оно применимо для METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER.

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 
+0

Я понимаю, что это так, мой вопрос был больше * почему * это было разрешено для примитивов. –

+0

Я не знаю конкретной причины, так как я не мог найти официальную документацию, но прохожу через [это] (http://stackoverflow.com/questions/1458535/which-types-can-be-used-for -java-annotation-members) (не совсем связанные, хотя) –