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

时间:2014-08-26 21:18:35

标签: java spring sonarqube findbugs pmd

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

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

---- class 1 ----

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

---- class 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);
  }

第2类中的代码应该导致违规,因为它使用的是Map,而不是SqlParameterSource。

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

请注意,namedParamJdbcTemplate对象是在基类中声明的,它不在具有违规的类中。另请注意,它可以被称为“namedParameterJdbcTemplate”或“模板”或开发人员想要的任何其他内容。

现在,我的问题。

  1. 是否可以使用PMD来检测此类违规行为?或者我需要FindBugs,因为它分析字节码?
  2. 如果可能使用PMD,是否可以使用XPath规则或仅使用Java?
  3. 有人可以给我一个例子,告诉我如何做这样的事情,最好用PMD吗? Findbugs或SonarQube也可以吗?
  4. 我已阅读documentation,特别是有关分析课程以外的规则的部分。我不太确定RuleContext是否有助于我想做什么或如何做。

1 个答案:

答案 0 :(得分:3)

您希望编写自定义检查,以便在调用特定方法时引发问题。

当你指出它时,你不能依赖变量名,所以你必须得到你正在进行方法调用的对象的类型,这是另一个分析级别。 使用PMD,您将能够调用名为您想要检测的方法及其参数数量。但是,如果你考虑方法重载,那就不够精确了。所以你实际上必须引用一些类型信息才能100%确定。

所以:

  1. 你可以,但你的统治最终会非常准确(但在某些情况下这可能令人满意)。最好的办法最好是与findbugs一起使用......

  2. 我认为你可以同时使用它们。

  3. 无法真正回答PMD,但您可以使用sonarqube规则引擎编写自己的规则:http://docs.codehaus.org/display/SONAR/Extending+Coding+Rules

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