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')@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

使用您自己的规则在Eclipse中自定义PMD相关推荐

  1. eclipse pmd使用_使用您自己的规则在Eclipse中自定义PMD

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

  2. eclipse中自定义视图_如何在Windows中自定义文件夹视图设置

    eclipse中自定义视图 While the Windows File Explorer seems somewhat simplified compared to older versions, ...

  3. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  4. eclipse中自定义快捷键保存位置.

    %Workspace%/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs 中. ...

  5. Eclipse中自定义注释

    转:http://blog.csdn.net/w8700569/article/details/6828586 首先按以下步骤进入要修改的位置: Window-->Preferences--&g ...

  6. eclipse 中自定义EL表达式时创建tld文件

    eclipse本身不带有tld文件,所以一般会创建一个xml文件,修改为tld文件 1.在WEB-INF文件下创建一个xml文件,修改名字为ELTest.tld 2.点击next,选择,然后点击nex ...

  7. 如何在eclipse中自定义一个jar包名称

    第一步:选择 Add Library 第二步:选择User Library 第三步: 第四步:添加下载好的jar包 这样自己定义的包名和导包就完全了.

  8. eclipse中自定义videoview类_android控件之VideoView建立自己的播放器

    简介 用来播放视频文件.该VideoView类可以加载各种来源的图像(如资源或内容提供商),需要计算它从视频测量,以便它可以在任何布局管理器使用,并提供诸如缩放和着色的各种显示选项.在其他的平台上面可 ...

  9. eclipse中字母大小写转换快捷键(备忘)

    eclipse中字母大小写转换快捷键(备忘) Ctrl+Shift+X 转为大写 Ctrl+Shift+Y 转为小写 该快捷键是可以在eclipse中自定义的,但并不推荐自定义:

最新文章

  1. C# 开发WinCE 遇到Motorola PDA 的问题记录
  2. LibSVM学习(六)——easy.py和grid.py的使用(转)
  3. java后台接收数据格式_Java后台基于POST获取JSON格式数据
  4. Shell(6)——array的删改unset
  5. javascript控制台_如何使用JavaScript控制台改善工作流程
  6. (转) 微软项目管理培训笔记(一)
  7. HTML5托拽上传(XMLHttpRequest和Google Gears)
  8. Filecoin官方提案FIP0013 添加批量提交ProveCommitSector以减少拥塞
  9. 7-8 猜数字 (20 分)
  10. 使用doctrine的内存耗尽解决办法
  11. html5教学案例撰写,教学案例撰写基本格式
  12. ini配置文件读写(大华)
  13. Python脚本实现对Linux服务器CPU、内存、磁盘空间以及负载情况的监测
  14. 高考生男生学铁路好还是计算机好,男生学铁路什么专业好?附铁路最好的5个专业...
  15. 自己写USB Joystick驱动
  16. python实现微信自动发拜年信息和回复消息
  17. Python的io模块详解
  18. android陀螺仪手机垂直角度,Android设备中实现陀螺仪(Orientation Sensor)
  19. c语言延时100us程序,编写100MS软件延时程序 汇编语言编写延时程序
  20. Python爬虫及其它函数知识读记及简单用法,持续更新中...

热门文章

  1. spring boot 入门荔枝
  2. 自底向上伸展树(之字形旋转+一字形旋转)
  3. 进程间通信(IPC)+进程加锁解锁
  4. 控制语句(if-else+循环+switch)汇编规则
  5. mybatis-spring 入门到实例
  6. Hibernate的关联映射--一对多、
  7. jax-rs jax-ws_对状态代码使用JAX-RS异常
  8. lombok 自动使用_Lombok,自动值和不可变项
  9. jboss eap_带有自定义模块的JBoss EAP上的骆驼
  10. Java性能:For-eaching与Streaming