将 Spring 构造函数注入与 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;
}

这样做会给我一个关于声纳扫描的严重漏洞,"这个成员"指的是每个声明的变量:

用"@Autowired"、"@Resource"、"@Inject"或"@Value"批注此成员,或将其删除

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

查看 SonarQube 规则 RSPEC-4288:弹簧组件应使用构造函数注入。虽然它没有解释为什么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

但是,当您使用 required = true(默认值)进行@Autowired时,您将永远不会有字段注入的NullPointerException

因此,我认为好的做法是停用并忽略此已弃用的规则。

在最近的 SonarQube 安装中,默认情况下禁用这些关于构造函数注入的规则。

更新 :构造函数注入还有其他用例,当您处于每个"方法"都是 Bean 构造函数的配置类中时。当 bean(如 RestTemplateBuilder)仅在某些构造函数中使用时,您不想使用字段注入,因此您使用完全没有字段声明的纯构造函数注入。

最新更新