使用您自己的规则在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')@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yii2之DetailView小部件

DetailView小部件用于展示单条数据记录&#xff0c;可配置属性很少&#xff0c;使用也很简单&#xff0c;直接贴代码&#xff0c;一看就懂&#xff01; yii小部件数据小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型对象&#xff…

gitlab的安装和基本维护

基本介绍 GitLab是一个自托管的Git项目仓库&#xff0c;可以自己搭建个人代码管理的仓库&#xff0c;功能与github类似。 安装 操作系统&#xff1a;CentOS6.5 gitlab官网下载安装地址&#xff1a;https://about.gitlab.com/downloads/#centos6 1.安装依赖的包 yum install cur…

unity中怎么在InspectorI面板加LOGO

转载于:https://www.cnblogs.com/unitySPK/p/7278925.html

重写到边缘–充分利用它! 在GlassFish上!

现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来&#xff0c;您一直在努力使用漂亮&#xff0c;简单&#xff0c;可添加书签的URL。 PrettyFaces很久以来就一直存在&#xff0c;即使它在3.3.3版本中可以说是成熟的&…

php yii框架路由,yii框架路由配置

首先要在服务器配置(httpd.conf)中开启重写模块#开启重写模块&#xff0c;将其前面的#去掉LoadModule rewrite_module modules/mod_rewrite.so#Directory中允许覆盖开启## Possible values for the Options directive are "None", "All",# or any combinat…

前端面试总结二

一、响应式和自适应的区别&#xff1a; 联系(相同点)&#xff1a; 响应式设计(responsive design)和自适应设计(adaptive design)都是用来解决网页在不同分辨率的屏幕和设备上展示的一项技术(或者说一种方法)。 区别&#xff1a; 响应式设计&#xff1a;通过CSS Media Queries(…

【看番杂感】Clannad系列观后感(剧透慎入)

前言 之前看第一季时&#xff0c;弹幕里总有人在刷“写作cl&#xff0c;读作人生”。当时我想&#xff0c;盲目把一部催泪番上升到人生的高度&#xff0c;这未免有些武断&#xff0c;也是对作品本身的不尊重。当看完第二季的我蓦然回首&#xff0c;发现这才是最最贴切的评价&am…

Centos7 开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机解决方法

开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机&#xff0c;也无法重新安装系统&#xff0c;解决方法&#xff1a;开机进入BIOS &#xff0c; 关闭ACPI选项即可正常开机 转载于:https://www.cnblogs.com/zhangjianghua/p/6376811.html

Spring MVC 3模板和Apache Tiles

对于任何Web应用程序而言&#xff0c;有效的设计考虑因素是使用模板引擎&#xff08;或工具&#xff09;&#xff0c;并且由于具有Spring的“可插拔”特性&#xff0c;因此集成模板机制&#xff08;例如Apache Tiles&#xff09;的确要容易得多。 在这篇简单的文章中&#xff0…

js 判断浏览器是否64位

js判断是否64位 浏览器 navigator.userAgent.match(/x64/i); 转载于:https://www.cnblogs.com/fanlinglong/p/7298733.html

浙江大学linux网络通信,浙江大学钟财军副教授——“Wireless Powered Communication Networks”...

2016年5月17日&#xff0c;浙江大学钟财军副教授应徐正元教授邀请在中科大西区科技实验楼东楼十层1011会议室做了一场题为“Wireless Powered Communication Networks”的学术报告。报告会由龚晨教授主持&#xff0c;共50余名师生参加。此次报告会得到了“中科院无线光电通信重…

[基础]PeopleSoft中的作业和调度作业集合定义

PeopleSoft进程调度器可以使一个或多个进程作为一个组。这个组在PeopleSoft中被称为作业(Job)。 PeopleSoft进程被定义为单个任务&#xff0c;程序或例程&#xff0c;例如cobol程序或AE程序或客户端运行的SQR。 作业由一个或多个相同或不同类型的进程组成&#xff0c;他们作为一…

win10 hyper-v 虚拟机ping不通宿主机问题

在Windows10 Hyper-V 中安装 Linux (Centos6.9)虚拟机无法 ping 通宿主机 这种情况下关闭 Windows 防火墙就能ping通了&#xff0c;当然关闭防火墙不安全。所以需要 做以下步骤: 控制面板-》系统和安全-》Windows防火墙-》高级设置-》入站规则 启用下图被红框选中的两个选…

Java枚举:您拥有优雅,优雅和力量,这就是我所爱!

当Java 8即将面世时&#xff0c;您确定您对Java 5中引入的枚举很了解吗&#xff1f; Java枚举仍然被低估了&#xff0c;很可惜&#xff0c;因为它们比您想象的要有用&#xff0c;它们不仅仅用于通常的枚举常量&#xff01; Java枚举是多态的 Java枚举是可以包含行为甚至数据的…

2)网页请求顺序

&#xff08;1&#xff09;分析浏览器访问一个网页的完整流程逻辑过程&#xff1a;http&#xff1a;//www.abc.com/def/ 转载于:https://www.cnblogs.com/xiaoyoucai/p/7306246.html

JavaOne 2012:调查JVM水晶球

我回到了希尔顿的A / B广场参加星期一的第四届会议&#xff0c;但首先去了希尔顿的顶层收拾午餐。 我每年都在JavaOne的第一天被提醒&#xff0c;涉及到每个人的第一天的午餐获取过程令人惊讶地令人沮丧。 我知道我在JavaOne的第一年的经历使我有些困惑&#xff0c;因为我不确定…

Jquery Memo

jQuery选择器 $( "#id" ) $( ".class" )$( "element" )全选择器&#xff08;*选择器&#xff09; * {padding: 0; margin: 0;}//子选择器 //$(div > p) 选择所有div元素里面的子元素P//后代选择器 //$(div p) 选择所有div元素…

使用JMSTester对JMS层进行基准测试

对于我去过的大多数客户端&#xff0c;使用ActiveMQ扩展JMS消息传递层是一个优先事项。 有多种方法可以实现这一目标&#xff0c;但毫无疑问&#xff0c;创建基准测试并在实际硬件上分析架构&#xff08;或者正如我的同事Gary Tully所说的“询问机器”&#xff09;是第一步。 但…

Js引擎解析执行 阅读笔记

Js引擎解析执行 阅读笔记 一篇阅读笔记http://km.oa.com/group/2178/articles/show/145691?kmrefsearch&from_page1&no1 早期:遍历语法树 Js引擎最早使用的是遍历语法树方式 &#xff08;syntax tree walker&#xff09; 分为两步 词法分析语法分析词法分析 i a b *…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a;不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。空格没有转义字符。合法转义字符如下&#xff1a;\a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(VT)…