在继续阅读之前,您应该检查我以前的文章之一-JPA-@Enumerated default attribute 。 当您与一群JPA项目人员一起工作时,几乎可以确定,其中一个开发人员将使用@Enumerated批注而不定义EnumType ,并且如果您不在数据库级别使用严格的数据验证(例如列级别的约束) ),您将陷入深深的麻烦。
我们想要实现的是在不使用EnumType的情况下使用@Enumerated报告一个错误:
@Entity
@Table(name = 'BENEFITS')
public class Benefit implements Serializable {...@Column(name = 'BENEFIT_TYPE')@Enumeratedpublic BenefitType getType() {return type;}...
}
如果使用@Enumerated和ORDINAL EnumType则发出警告:
@Entity
@Table(name = 'BENEFITS')
public class Benefit implements Serializable {...@Column(name = 'BENEFIT_TYPE')@Enumerated(EnumType.ORDINAL)public BenefitType getType() {return type;}...
}
我们可以通过两种方式实现我们的目标,要么用Java描述PMD规则,要么使用XPath –我将在本文中重点介绍第二种方式。
让我们从头开始;)–我们必须首先下载PMD (我使用版本4.2.5, pmd-bin-4.2.5.zip ),将其解压缩到某个位置,将工作目录更改为解压缩的PMD目录,然后运行规则设计器(可以在./bin/designer.sh中找到)。 您应该会看到以下内容:
让我们将要分析的代码放入源代码面板,然后单击“执行”按钮:
在“抽象语法树”面板的中间,您可能会看到:注释/ MarkerAnnotation /与未定义EnumType的 @Enumerated注释相对应的Name结构。 为了匹配它,我们将在XPath表达式之后放入XPath Query面板:
//MarkerAnnotation/Name[@Image = 'Enumerated']
现在点击“开始”按钮时:
您将在右下角的面板中找到找到的匹配项:) – XPath查询正确:)。
现在,当我们有了XPath查询时,我们必须使用它来定义规则,让我们打开新的XML文件,将其命名为jpa-ruleset.xml ,并放入其中:
<ruleset name='JPA ruleset'xmlns='http://pmd.sf.net/ruleset/1.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd'xsi:noNamespaceSchemaLocation='http://pmd.sf.net/ruleset_xml_schema.xsd'><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表达式的替代方案:
<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中。 此时,我假设您已经安装了Eclipse的PMD插件(请参阅: PMD –与IDE的集成 )。
打开Eclipse Preferences,找到PMD部分并展开它,您应该看到:
点击“导入规则集...”
选择包含规则集的文件,选择是否要通过引用或复制导入(在这种情况下,您的规则集名称将被忽略,并且将使用' pmd-eclipse '名称),并且您应该看到将两个规则添加到了清单:
在eclipse询问时执行必要的构建,然后在开始使用我们的新规则之前,请检查项目属性:
应该启用“启用PMD”选项,以便PMD即时检查您的代码,我们新添加的规则应在该项目中处于活动状态(默认情况下为默认状态)。
让我们现在写一些“坏代码”,匹配我们定义的第一条规则:
当您用鼠标将红色标记指向左侧时,您将看到规则消息,如XML中所定义:
第二条规则匹配:
和消息,如XML所定义:
甜点的几个链接:
- 如何编写PMD规则
- XPath规则教程
- 如何制定新的规则集
参考: 使用我们自己的JCG合作伙伴 Micha 的规则在Eclipse中自定义PMD ? 术士思想博客上的Ja?tak。
翻译自: https://www.javacodegeeks.com/2012/10/customize-pmd-in-eclipse-with-your-own.html