在繼續閱讀之前,您應該檢查我以前的文章之一-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