需求是 自定义SonarQube规则 “redis禁止使用keys命令” 以下代码是参照其他规则写的 但是总是会扫描不到相关问题
找到的 RedisTemplate 的 TypeBinding为 missing:RedisTemplate
规则代码
package org.sonar.samples.java.checks;
import org.sonar.check.Rule;
import org.sonar.java.model.ExpressionUtils;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.semantic.MethodMatchers;
import org.sonar.plugins.java.api.tree.*;
import java.util.Collections;
import java.util.List;
@Rule(key = "AvoidRedisKeysRule")
public class AvoidRedisKeysRule extends IssuableSubscriptionVisitor {
private static final MethodMatchers METHOD_MATCHERS = MethodMatchers.create()
.ofTypes("org.springframework.data.redis.core.RedisTemplate")
.names("keys")
.withAnyParameters()
.build();
@Override
public List nodesToVisit() {
return Collections.singletonList(Tree.Kind.METHOD_INVOCATION);
}
@Override
public void visitNode(Tree tree) {
MethodInvocationTree mit = (MethodInvocationTree) tree;
if(METHOD_MATCHERS.matches(mit)){
IdentifierTree id = ExpressionUtils.methodName(mit);
reportIssue(id,"do not use keys() or scan()");
}
}
}
被测代码
import org.springframework.data.redis.core.RedisTemplate;
class AvoidRedisKeysRule {
void foo(RedisTemplate redisTemplate) {
redisTemplate.keys("*");// Noncompliant
this.keys(); // Compliant
}
void keys(){
}
}
尝试导入 redis 相关依赖 还是不行
尝试 编写 禁止使用 string 的 substring 命令 找到的 String的typebinding也是missing:type
// Noncompliant 注释的一行 应该被检测到
// Compliant 注释的一行不应该被检测到