Servlet不应使用Spring autowire将可变实例字段设置为假肯定(squid:S2226)

时间:2018-09-17 11:13:50

标签: java spring servlets dependency-injection sonarqube

我有一个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中打开一个潜在的误报问题

2 个答案:

答案 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