在SonarQube中使用Spring构造函数注入

Vic*_*r S 6 java spring dependency-injection spring-annotations sonarqube

我有一段带有字段注入的代码,我试图将其转换为使用构造函数注入。初始代码如下所示:

@Autowired
private Environment env;

@Autowired
private YYYAdaptor yyyAdaptor;

@Autowired
private JAXBContext jaxbContext;
Run Code Online (Sandbox Code Playgroud)

这就是我重写它的方式:

private Environment env;
private YYYAdaptor yyyAdaptor;
private JAXBContext jaxbContext;

@Autowired
public YYYResource(Environment env, YYYAdaptor yyyAdaptor, 
    @Qualifier("YYYYReq") JAXBContext jaxbContext) {

    this.env = env;
    this.yyyAdaptor = yyyAdaptor;
    this.jaxbContext = jaxbContext;
}
Run Code Online (Sandbox Code Playgroud)

这样做给了我一个声纳扫描的严重漏洞,“此成员”引用了每个声明的变量:

用“ @Autowired”,“ @ Resource”,“ @ Inject”或“ @Value”注释此成员,或将其删除

我可以避免使用声场注入同时避免声纳拟合的最佳方法是什么?

Nik*_*las 8

查看 SonarQube 规则RSPEC-4288:Spring 组件应该使用构造函数注入。尽管它没有解释为什么final使用被触发为不合规,但有一个合规的代码示例。初始化字段以null使其兼容 SonarQube:

private Environment env = null;
private YYYAdaptor yyyAdaptor = null;
private JAXBContext jaxbContext = null;
Run Code Online (Sandbox Code Playgroud)

然而SonarQube所说的并不神圣,而且充满了很多误报这些静态分析器解决了值得进一步反思的问题,但不是明确的,并且是基于有意见的人制定的规则。

就我个人而言,我会将这个问题标记为无法修复,并声明字段以final使对象不可变:

private final Environment env;
private final YYYAdaptor yyyAdaptor;
private final JAXBContext jaxbContext;
Run Code Online (Sandbox Code Playgroud)

  • 哈哈,我查看了该规则,认为这里一切都应该没问题:`= null;` 不可能是问题,但你的答案证明相反。+1 (2认同)