【问题标题】:How to enforce constructor injection with checkstyle or PMD?如何使用 checkstyle 或 PMD 强制执行构造函数注入?
【发布时间】:2021-05-26 21:01:53
【问题描述】:

我想在 GWT 项目中使用 Guice 注释 com.google.inject.Inject 来强制执行构造函数注入,该注释可以放置在用于字段注入的字段上,也可以放置在用于构造函数注入的构造函数上。

该项目已经使用了 checkstyle 和 PMD。

Afaik 我可以通过禁止字段上的注释来简单地强制构造函数注入,但是我发现没有 checkstyle 模块或 PMD 规则来执行此操作。我确定我遗漏了一些东西,因为它似乎是静态代码分析工具的日常任务。

【问题讨论】:

  • 这对 PMD 来说是一件容易的事。尽管对此没有开箱即用的规则,但 PMD 允许轻松扩展和自定义。您可以创建自己的规则 (pmd.github.io/pmd-6.31.0/…),特别是对于这种情况,XPath 规则应该是微不足道的 (pmd.github.io/pmd-6.31.0/…)
  • 我之前已经建议过了。为其他用户可以参考和使用的用户贡献规则创建一个单独的存储库可能是一个好主意,这与核心 PMD 规则不同。这与实验规则不同。类似于 Checkstyle 的 sevntu 检查。

标签: java annotations guice checkstyle pmd


【解决方案1】:

这听起来像是 Checkstyle 的 MatchXpath 检查的不错选择。您可以像这样将两个模块添加到您的配置中:

<module name="MatchXpath">
  <property name="query" value="//VARIABLE_DEF/MODIFIERS/ANNOTATION/IDENT[@text='Inject']"/>
  <message key="matchxpath.match"
                     value="Inject annotation only allowed on constructors."/>
</module>

<module name="MatchXpath">
  <property name="query" value="//METHOD_DEF/MODIFIERS/ANNOTATION[./IDENT[@text='Inject']]"/>
  <message key="matchxpath.match"
                     value="Inject annotation only allowed on constructors."/>
</module>

示例 java 文件:

public class Communication {
    @Inject @Named("SMSComms")
    CommunicationMode smsComms;

    @Inject
    public void setEmailCommunicator(@Named("EmailComms") CommunicationMode emailComms) {
        this.emailComms = emailComms;
    }

    @Inject
    public Communication(@Named("IMComms") CommunicationMode imComms) {
        this.imComms = imComms;
    }
}

结果:


➜  src java -jar checkstyle-8.40-all.jar -c config.xml Communication.java
Starting audit...
[ERROR] src/Communication.java:2:6: Inject annotation only allowed on constructors. [MatchXpath]
[ERROR] src/Communication.java:5:5: Inject annotation only allowed on constructors. [MatchXpath]
Audit done.
Checkstyle ends with 2 errors.

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 2019-08-12
    • 2016-02-07
    • 2017-12-24
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多