使用您自己的规则在Eclipse中自定义PMD

PMD是非常好的Java代码扫描程序,可帮助您避免潜在的编程问题。 它可以轻松扩展以满足您的需求,并且本文将为您带来与JPA的@Enumerated注释用法相关的自定义PMD规则的简单示例。

在继续阅读之前,您应该检查我以前的文章之一-JPA-@Enumerated default attribute 。 当您与一群JPA项目人员一起工作时,几乎可以确定,其中一个开发人员将使用@Enumerated批注而不定义EnumType ,并且如果您不在数据库级别使用严格的数据验证(例如列级别的约束) ),您将陷入深深的麻烦。

我们想要实现的是在不使用EnumType的情况下使用@Enumerated报告一个错误

@Entity
@Table(name = 'BENEFITS')
public class Benefit implements Serializable {
    ...
    @Column(name = 'BENEFIT_TYPE')@Enumerated
    public 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所定义:

甜点的几个链接:

参考: 使用我们自己JCG合作伙伴 Micha 的规则在Eclipse中自定义PMD术士思想博客上的Ja?tak。


翻译自: https://www.javacodegeeks.com/2012/10/customize-pmd-in-eclipse-with-your-own.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值