使用您自己的規則在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.pswp.cn/news/371581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371581.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

切換oracle用戶impdp,Oracle 12c pdb使用expdp/impdp導入導出

12c推出了可插拔數據庫&#xff0c;在一個容器cdb中以多租戶的形式同時存在多個數據庫pdb。在為pdb做數據泵導入導出時和傳統的數據庫有少許不同。1&#xff0c;需要為pdb添加tansnames2&#xff0c;導入導出時需要在userid參數內指定其tansnames的值&#xff0c;比如 useridus…

搭建mysql集群,使用Percona XtraDB Cluster搭建

Percona XtraDB Cluster提供的特性有&#xff1a;1.同步復制&#xff0c;事務要么在所有節點提交或不提交。2.多主復制&#xff0c;可以在任意節點進行寫操作。3.在從服務器上并行應用事件&#xff0c;真正意義上的并行復制。4.節點自動配置。5.數據一致性&#xff0c;不再是異…

使用NoSQL實現實體服務–第4部分:Java EE

現在&#xff0c;我已經準備好了框架式的合同優先型Web服務&#xff0c;并使用Ektorp和CouchDB創建了數據訪問層 &#xff0c;是時候將它們連接到一個可以正常工作的實體服務中了 。 為此&#xff0c;我將使用Java EE和Glassfish 3.1。 值得注意的是&#xff0c;對于他的那種R&…

yii2之DetailView小部件

DetailView小部件用于展示單條數據記錄&#xff0c;可配置屬性很少&#xff0c;使用也很簡單&#xff0c;直接貼代碼&#xff0c;一看就懂&#xff01; yii小部件數據小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型對象&#xff…

克隆安裝oracle,Oracle 之 Cloning $oracle_home (克隆安裝oracle軟件)

用途&#xff1a;Cloning an Oracle Home &#xff0c; 可以免去多臺機器重復安裝oracle軟件1、停止相關進程[rootnode1 bin]# ./crsctl stop cluster -all2、打包 dbhome_1 目錄[rootnode1 11.2.0]# cd /u01/app/oracle/product/11.2.0/[rootnode1 11.2.0]# tar -zcvpf db_1.b…

gitlab的安裝和基本維護

基本介紹 GitLab是一個自托管的Git項目倉庫&#xff0c;可以自己搭建個人代碼管理的倉庫&#xff0c;功能與github類似。 安裝 操作系統&#xff1a;CentOS6.5 gitlab官網下載安裝地址&#xff1a;https://about.gitlab.com/downloads/#centos6 1.安裝依賴的包 yum install cur…

Spring配置文件和Java配置

我的上一個博客介紹了Spring 3.1的配置文件&#xff0c;并解釋了使用它們的業務案例&#xff0c;并演示了它們在Spring XML配置文件中的用法。 但是&#xff0c;似乎很多開發人員更喜歡使用Spring的基于Java的應用程序配置&#xff0c;因此Spring設計了一種使用帶有現有Configu…

php 刪除單個文件大小,php刪除指定大小的jpg文件

function actionZmdel(){//set_time_limit(0);$dir dirname(dirname(dirname(dirname(__FILE__))))./2012jxgwyimg;$dirarr scandir($dir);echo 正在刪除...;foreach($dirarr as $subdir){if($subdir ! . && $subdir ! ..){$path $dir./.$subdir;$files glob($path…

2017寒假零基礎學習Python系列之函數之 函數之定義可變參數

若想讓函數接受任意個參數&#xff0c;就可以定義一個可變的參數&#xff1a; def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1,2,5,6) 原理是Python解釋器把傳入的一組參數封裝在一個tuple傳遞給可變參數&#xff0c;因此在函數內部&#xff0c;直…

在Windows上構建OpenJDK

通過做一些實驗&#xff0c;我發現手頭提供JDK源代碼來進行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我決定下載并編譯該野獸。 顯然&#xff0c;這花了我一些時間&#xff0c;盡管我最初的想法是&#xff0c;它應該和運行make命令一樣簡單&#xff1a;&…

unity中怎么在InspectorI面板加LOGO

轉載于:https://www.cnblogs.com/unitySPK/p/7278925.html

oracle stream 主鍵,oracle stream配置向導

1. Stream 的工作原理Stream 是Oracle Advanced Queue技術的一種擴展應用&#xff0c;這種技術最基本的原理就是收集事件&#xff0c;把時間保存在隊列中&#xff0c;然后把這些事件發布給不同的訂閱者。從DBA的角度來說&#xff0c;就是把捕獲Oracle數據庫產生的Redo日志&…

JavaScriptDOM 十四. Event DOM的屬性

1 <!DOCTYPE html>2 <html>3 <head>4 <title></title>5 <script type"text/javascript">6 7 /*8 1. --------------- Event DOM 事件DOM 用戶交互 ------------------9 當事件發生時, 執行JS功能代碼10 11 常用…

五、創建Bean的三種方式

五、創建Bean的三種方式轉載于:https://www.cnblogs.com/ljiwej/p/7280614.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(…

“Spring入門”教程系列

大家好&#xff0c; 我很高興向您介紹“Spring入門”教程系列&#xff01; 這是一系列文章&#xff0c;最初由我們的JCG合作伙伴 Michal Vrtiak在vrtoonjava博客上撰寫 。 本系列中將逐步創建一個時間表管理應用程序&#xff0c;并且每個教程都在前一個教程的基礎上構建。 處…

【看番雜感】Clannad系列觀后感(劇透慎入)

前言 之前看第一季時&#xff0c;彈幕里總有人在刷“寫作cl&#xff0c;讀作人生”。當時我想&#xff0c;盲目把一部催淚番上升到人生的高度&#xff0c;這未免有些武斷&#xff0c;也是對作品本身的不尊重。當看完第二季的我驀然回首&#xff0c;發現這才是最最貼切的評價&am…

oracle+tns+01106,TNS-01106:Listener using listener name already been started

最近在做HACMP雙機互備切換測試的時候&#xff0c;發現一個問題&#xff1a;A節點的listener端口為1521 &#xff0c;B節點的listener端口為1522&#xff0c;為什么兩個節點的監聽要用不同的端口號&#xff1f;當時AB機使用不同端口是基于如下考慮&#xff1a;HACMP的切換數據庫…