java-当基类中存在someObject时,使用PMD检查someObject.methodCall

我们有使用Spring框架的NamedParameterJdbcTemplate执行各种JDBC语句的应用程序.此类中的大多数方法都已重载.例如,一个版本的update()接受一个Map,其中的键是绑定变量名称,值是变量替换.另一个版本接受SqlParameterSource,它也允许提供列类型信息.我想写一个标记使用Map版本的规则,因为如果要避免在重载下出现问题,则提供类型信息is important for Oracle DBs.

我需要检查的一些代码是这样写的:

—- 1级—-

public abstract class BaseDao {
  @Autowired
  NamedParameterJdbcTemplate namedParamJdbcTemplate;
  ...
}

—-第2类—-

public class ThingDao extends BaseDao {
  public int updateTheThing(final Integer thingId, final Integer someVal) {
    final Map<String, Object> sqlParameters = new HashMap<String, Object>();
    sqlParameters.put(":thingIdVar", thingId);
    sqlParameters.put(":otherVar", someVal);

    final String query =
            "UPDATE THINGTABLE SET SOME_FIELD=:otherVar WHERE THING_ID=:thingIdVar";
    return namedParamJdbcTemplate.update(query, sqlParameters);
  }

由于使用Map而不是SqlParameterSource,所以类2中的代码应引起违规.

检查update(…)方法可能会导致误报,因为这是一个相当常见的方法名称.我只关心特定Spring类中的那些.

请注意,namedParamJdbcTemplate对象是在基类中声明的,它不在具有违规的类中.还要注意,它可以称为“ namedParameterJdbcTemplate”或“ template”,也可以称为开发人员想要的任何其他名称.

现在,我的问题.

>是否可以使用PMD这样检测违规?还是我需要FindBugs,因为它可以分析字节码?
>如果可以使用PMD,是否可以使用XPath规则或仅使用Java?
>有人可以给我指出一个示例,说明我该如何做这样的事情,最好是使用PMD? Findbugs或SonarQube也可以吗?

我已经阅读了documentation,尤其是关于规则的部分,该部分分析的内容比全班还多.我不太确定RuleContext是否对我想做的事情或如何做有所帮助.

解决方法:

您想要编写自定义检查以在调用特定方法时引发问题.

正如您指出的那样,您不能依赖变量名,因此必须获取进行方法调用的对象的类型,这是另一层次的分析.
使用PMD,您将能够调用名为您想要检测的方法及其参数数量的方法.但是,如果考虑例如方法重载,那还不够精确.因此,您实际上必须引用一些类型信息以确保100%正确.

所以:

>您可以,但是您裁定最终会变得非常不精确(但是在某些情况下可以令人满意).最好的方法最好是与findbugs一起使用…
>我认为您可以同时使用.
>不能真正回答PMD,但是您可以使用sonarqube规则引擎编写自己的规则:http://docs.codehaus.org/display/SONAR/Extending+Coding+Rules

我们实际上是希望在sonarqube java插件中提供此功能,以便能够访问语义信息(名称的类型和名称),以便使用此数据编写自己的规则.

上一篇:IDEA 插件!SonarQube——如何搭建SonarQube完整版


下一篇:SonarQube安装与SonarLint插件