java - 在 SonarQube 中使用 Spring 构造函数注入(inject)

标签 java spring dependency-injection sonarqube spring-annotations

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

@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;
}

这样做会让我在 Sonar 扫描中出现严重漏洞,“这个成员”指的是每个声明的变量:

Annotate this member with "@Autowired", "@Resource", "@Inject", or "@Value", or remove it

避免使用场注入(inject)同时避免 Sonar 失调的最佳方法是什么?

最佳答案

查看 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;

关于java - 在 SonarQube 中使用 Spring 构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54162663/

相关文章:

java - PL/SQL - 仅当记录不存在时插入记录

java - 添加 RandomAccessFile 方法

java - 如何在 Spring Boot 应用程序的资源文件夹中创建文件夹?

mysql 中的 java.lang.NullPointerException

c# - 如何测试事件触发

java - 洋葱-六边形架构依赖混淆

java - apache Heron可以在windows上运行吗

java - Tomcat/SQL Server/Spring - 当 setStructured 参数由 JNDI 配置引起时,使用 SQLServerCallableStatement 抛出异常

java - Spring Web 应用程序通过本地主机上的 Gmail 发送电子邮件,而不是服务器

java - 在 Web 容器外的 Java 6 中使用 Guice 3 和 JAX-WS