gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:02 26 4
gpt4 key购买 nike

我们有使用 Spring 框架的 NamedParameterJdbcTemplate 的应用程序执行各种 JDBC 语句。此类中的大多数方法都已重载。例如,update() 的一个版本接受一个 Map,其中键是绑定(bind)变量名称,值是变量替换。另一个版本接受 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);
}

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

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

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

现在,我的问题。

  1. 是否可以使用 PMD 检测此类违规行为?或者我是否需要 FindBugs,因为它分析字节码?
  2. 如果可以使用 PMD,是否可以使用 XPath 规则或仅使用 Java?
  3. 谁能给我举个例子,说明我将如何做这样的事情,最好是使用 PMD? Findbugs 或 SonarQube 也可以吗?

我已阅读documentation ,特别是关于比类分析更多的规则的部分。我不太确定 RuleContext 是否有助于我想做什么,或者如何帮助。

最佳答案

您想编写自定义检查以在调用特定方法时提出问题。

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

所以:

  1. 你可以,但你的规则最终会非常不精确(但在某些情况下这可能令人满意)。最好的方法最好是使用 findbugs ...

  2. 我认为您可以同时使用两者。

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

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

关于java - 当基类中存在 someObject 时,使用 PMD 检查 someObject.methodCall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25515294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com