我们有应用程序使用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”或“模板”或开发人员想要的任何其他内容。
现在,我的问题。
我已阅读documentation,特别是有关分析课程以外的规则的部分。我不太确定RuleContext
是否有助于我想做什么或如何做。
答案 0 :(得分:3)
您希望编写自定义检查,以便在调用特定方法时引发问题。
当你指出它时,你不能依赖变量名,所以你必须得到你正在进行方法调用的对象的类型,这是另一个分析级别。 使用PMD,您将能够调用名为您想要检测的方法及其参数数量。但是,如果你考虑方法重载,那就不够精确了。所以你实际上必须引用一些类型信息才能100%确定。
所以:
你可以,但你的统治最终会非常准确(但在某些情况下这可能令人满意)。最好的办法最好是与findbugs一起使用......
我认为你可以同时使用它们。
无法真正回答PMD,但您可以使用sonarqube规则引擎编写自己的规则:http://docs.codehaus.org/display/SONAR/Extending+Coding+Rules
这是我们实际想要在sonarqube java插件中提供的功能,以便能够访问语义信息(名称的类型和含义),以便使用此数据编写自己的规则。