Прежде чем продолжить чтение, вы должны проверить один из моих предыдущих постов — JPA — атрибут @Enumerated по умолчанию . Когда вы работаете с группой людей над проектом JPA, почти наверняка один из разработчиков будет использовать аннотацию @Enumerated без определения EnumType , и если вы не используете строгую проверку данных на уровне БД (например, ограничения на уровне столбцов) ), вы попадете в глубокие неприятности.
Мы хотели бы добиться сообщения об ошибке при использовании @Enumerated без EnumType:
01
02
03
04
05
06
07
08
09
10
11
|
@Entity @Table (name = 'BENEFITS' ) public class Benefit implements Serializable { ... @Column (name = 'BENEFIT_TYPE' ) <strong> @Enumerated </strong> public BenefitType getType() { return type; } ... } |
и предупреждение, если вы используете @Enumerated с ORDINAL EnumType:
01
02
03
04
05
06
07
08
09
10
11
|
@Entity @Table (name = 'BENEFITS' ) public class Benefit implements Serializable { ... @Column (name = 'BENEFIT_TYPE' ) <strong> @Enumerated (EnumType.ORDINAL)</strong> public BenefitType getType() { return type; } ... } |
Мы можем достичь нашей цели двумя способами, либо описав правило PMD в Java, либо используя XPath — в этом посте я остановлюсь на втором способе.
Давайте начнем с начала;) — сначала нужно загрузить PMD (я использовал версию 4.2.5, pmd-bin-4.2.5.zip ), распаковать его куда-нибудь, изменить рабочий каталог на распакованный каталог PMD и запустить Дизайнер правил (его можно найти в ./bin/designer.sh). Вы должны увидеть что-то вроде этого:
Давайте поместим код, который мы хотим проанализировать, в панель исходного кода и нажмите кнопку «Перейти»:
В середине панели «Абстрактное синтаксическое дерево» вы можете увидеть: Структура аннотации / MarkerAnnotation / Имя, соответствующая нашей аннотации @Enumerated без определенного EnumType . Чтобы соответствовать ему, мы поместим в панель запросов XPath следующее выражение XPath:
1
|
//MarkerAnnotation/Name[@Image = 'Enumerated'] |
Теперь, когда вы нажимаете кнопку «Перейти»:
внизу справа вы увидите, что совпадение найдено 🙂 — XPath Query верен :).
Теперь, когда у нас есть запрос XPath, мы должны определить правило, используя его, давайте откроем новый XML-файл, назовем его jpa-ruleset.xml и вставим в него:
01
02
03
04
05
06
07
08
09
10
11
12
|
< ruleset name = 'JPA ruleset' < description >JPA ruleset</ description > < rule name = 'AvoidDefaultEnumeratedValue' message = 'By default @Enumerated will use the ordinal.' class = 'net.sourceforge.pmd.rules.XPathRule' > < priority >2</ priority > < properties > < property name = 'xpath' value = '//MarkerAnnotation/Name[@Image = ' Enumerated']' /> </ properties > </ rule > </ ruleset > |
Как вы видите, мы используем net.sourceforge.pmd.rules.XPathRule в качестве класса правила и определяем свойство xpath для этого правила, содержащее наш запрос XPath. Приоритет в вышеприведенном примере означает: 1 — ошибка, высокий приоритет, 2 — ошибка, обычный приоритет, 3 — предупреждение, высокий приоритет, 4 — предупреждение, нормальный приоритет и 5 — информация.
Мы добавим еще одно правило в наш набор правил JPA, отвечающее за сообщение о предупреждении, когда @Enumerated используется с явным ORDINAL EnumType — оно может быть либо @Enumerated (EnumType.ORDINAL), либо @Enumerated (value = EnumType.ORDINAL) , поэтому нам нужно альтернатива двум выражениям XPath:
1
2
3
4
5
6
7
8
|
< rule name = 'EnumeratedAsOrdinal' message = 'Enumeration constants shouldn' 't be persisted using ordinal.' class = 'net.sourceforge.pmd.rules.XPathRule' > < priority >4</ priority > < properties > < property name = 'xpath' value=' //SingleMemberAnnotation/Name[@ Image = 'Enumerated' ]/following-sibling::MemberValue//Name[@ Image = 'EnumType.ORDINAL' ] | //NormalAnnotation/Name[@ Image = 'Enumerated' ]/following-sibling::MemberValuePairs/MemberValuePair[@ Image = 'value' ]//Name[@ Image = 'EnumType.ORDINAL' ]' /> </ properties > </ rule > |
Теперь, когда у нас есть набор правил, содержащий эти два правила, мы импортируем его в Eclipse IDE. На данный момент я предполагаю, что вы уже установили плагин PMD для Eclipse (см .: PMD — Интеграция с IDE ).
Откройте Eclipse Preferences, найдите раздел PMD и раскройте его, вы должны увидеть:
нажмите «Импортировать набор правил…»
выберите файл, содержащий набор правил, выберите, хотите ли вы импортировать его по ссылке или скопировать (в этом случае ваше имя набора правил будет проигнорировано, и будет использовано имя ‘ pmd-eclipse ‘), и вы должны увидеть два наших правила, добавленные к список:
Выполните необходимую сборку по запросу eclipse, и прежде чем вы начнете пользоваться нашими новыми правилами, проверьте свойства проекта:
Параметр «Включить PMD» должен быть включен, чтобы позволить PMD проверять ваш код на лету, наши новые добавленные правила должны быть активными для этого проекта (они будут по умолчанию).
Давайте сейчас напишем «плохой код», соответствующий первому определенному нами правилу:
Когда вы укажете мышью на красный маркер слева, вы увидите сообщение о правиле, как определено в XML:
Второе правило соответствия:
и сообщение, как определено в XML:
Несколько ссылок на десерт:
Справка: Настройте PMD в Eclipse по своим собственным правилам от нашего партнера по JCG Миха? Ja? Tak в блоге Мысли Чернокнижника