我有一段带有字段注入(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/