我有一个Servlet,它具有使用以下功能的Spring自动装配功能:
WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext())
.getAutowireCapableBeanFactory().autowireBean(this);
当我自动装配bean时,SonarQube用Servlet警告,Servlet不应具有可变的实例字段(squid:S2226)
@Autowired
MyBean myBean;
是SonarQube错误,它忽略了Spring自动装配吗?我可以添加其他注释来防止此警告吗?我错过了什么吗?
通过合同,一个servlet容器为每个servlet创建一个实例,然后将一个专用线程附加到每个新的传入HTTP请求以处理该请求。因此,所有线程共享servlet实例,并通过扩展它们的实例字段。为了防止在运行时出现任何误解和意外行为,所有servlet字段都应该是静态的和/或最终的,或者只是删除即可。
编辑
我发现类似的issue与Java的@Inject
有关,不应发出此警告
实际上,当使用@Inject注释字段时,不会对其进行突变。 因此,使用此注释注释的字段不应引起问题RSPEC-2226。
编辑2
在SonarSource Community中打开一个潜在的误报问题
答案 0 :(得分:2)
我认为您应该完全删除AutowireCapableBeanFactory。相反,您应该像这样注册servlet
@Bean
public ServletRegistrationBean yourServlet(MyBean mybean) {
// initialize your Servlet here = new YourServlet(myBean);
//register it to as ServletRegistrationBean
return servletRegistration;
}
此注册假定您已经在Spring应用程序上下文中拥有MyBean。
答案 1 :(得分:1)
我相信您是对的,这是假阳性,不应以与在带@ Inject,@ Resource或@EJB注释的字段上引发的方式相同的方式在此字段上引发问题。
我创建了一个问题来解决此问题https://jira.sonarsource.com/browse/SONARJAVA-2895