我们有使用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插件中提供此功能,以便能够访问语义信息(名称的类型和名称),以便使用此数据编写自己的规则.