在 SonarQube 中使用 Spring 构造函数注入
Using Spring constructor injection with SonarQube
我有一段带有字段注入的代码,我正试图将其转换为使用构造函数注入。初始代码如下所示:
@Autowired
private Environment env;
@Autowired
private YYYAdaptor yyyAdaptor;
@Autowired
private JAXBContext jaxbContext;
这就是我重写它的方式:
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;
}
这样做让我在声纳扫描中出现严重漏洞,"this member" 引用每个声明的变量:
Annotate this member with "@Autowired", "@Resource", "@Inject", or "@Value", or remove it
避免使用场注入同时避免声纳失调的最佳方法是什么?
检查 SonarQube 规则 RSPEC-4288: Spring components should use constructor injection。虽然它没有解释为什么 final
用法被触发为不合规,但有一个合规代码示例。将字段初始化为 null
以使其符合 SonarQube:
private Environment env = null;
private YYYAdaptor yyyAdaptor = null;
private JAXBContext jaxbContext = null;
然而,SonarQube 所说的并不神圣,并且充满了很多误报。这些静态分析器解决了 值得 进一步反省的问题,但不是确定的并且基于有意见的人制定的规则。
就个人而言,我会将此问题标记为 不会修复 并将字段声明为 final
以使对象不可变:
private final Environment env;
private final YYYAdaptor yyyAdaptor;
private final JAXBContext jaxbContext;
此 SonarQube 规则的基本原理是避免 NullPointerException
就像此规则所解释的那样:https://rules.sonarsource.com/java/RSPEC-3306
但是当你有 @Autowired
且 required = true(默认值)时,你将永远不会有 NullPointerException
和字段注入。
所以我认为好的做法是停用并忽略这条已弃用的规则。
在最近的 SonarQube 安装中,这些关于构造函数注入的规则默认是禁用的。
Update :构造函数注入还有另一个用例,当您处于配置 class 中时,每个 "method" 都是一个 bean构造函数。当 bean(如 RestTemplateBuilder
)仅在某些构造函数中使用时,您不想使用字段注入,因此您使用完全没有字段声明的纯构造函数注入。
我有一段带有字段注入的代码,我正试图将其转换为使用构造函数注入。初始代码如下所示:
@Autowired
private Environment env;
@Autowired
private YYYAdaptor yyyAdaptor;
@Autowired
private JAXBContext jaxbContext;
这就是我重写它的方式:
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;
}
这样做让我在声纳扫描中出现严重漏洞,"this member" 引用每个声明的变量:
Annotate this member with "@Autowired", "@Resource", "@Inject", or "@Value", or remove it
避免使用场注入同时避免声纳失调的最佳方法是什么?
检查 SonarQube 规则 RSPEC-4288: Spring components should use constructor injection。虽然它没有解释为什么 final
用法被触发为不合规,但有一个合规代码示例。将字段初始化为 null
以使其符合 SonarQube:
private Environment env = null;
private YYYAdaptor yyyAdaptor = null;
private JAXBContext jaxbContext = null;
然而,SonarQube 所说的并不神圣,并且充满了很多误报。这些静态分析器解决了 值得 进一步反省的问题,但不是确定的并且基于有意见的人制定的规则。
就个人而言,我会将此问题标记为 不会修复 并将字段声明为 final
以使对象不可变:
private final Environment env;
private final YYYAdaptor yyyAdaptor;
private final JAXBContext jaxbContext;
此 SonarQube 规则的基本原理是避免 NullPointerException
就像此规则所解释的那样:https://rules.sonarsource.com/java/RSPEC-3306
但是当你有 @Autowired
且 required = true(默认值)时,你将永远不会有 NullPointerException
和字段注入。
所以我认为好的做法是停用并忽略这条已弃用的规则。
在最近的 SonarQube 安装中,这些关于构造函数注入的规则默认是禁用的。
Update :构造函数注入还有另一个用例,当您处于配置 class 中时,每个 "method" 都是一个 bean构造函数。当 bean(如 RestTemplateBuilder
)仅在某些构造函数中使用时,您不想使用字段注入,因此您使用完全没有字段声明的纯构造函数注入。