У сервлетов не должно быть изменяемых полей экземпляра, ложно положительных с Spring autowire (squid: S2226) - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть сервлет, который имеет возможности автоматического подключения Spring, используя:

WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext())
                    .getAutowireCapableBeanFactory().autowireBean(this);

Когда я автоматически подключаю свои бины, SonarQube предупреждает с помощью `У сервлетов не должно быть изменяемых полей экземпляра (squid: S2226)

@Autowired
MyBean myBean;

Это ошибка SonarQube, которая игнорирует автоматическое подключение Spring? Могу ли я добавить другую аннотацию, чтобы предотвратить это предупреждение? я что-то упустил?

По контракту контейнер сервлета создает один экземпляр каждого сервлета, а затем к каждому новому входящему HTTP-запросу присоединяется выделенный поток для его обработки. Таким образом, все потоки совместно используют экземпляры сервлета и, соответственно, свои поля экземпляров. Во избежание недопонимания и непредвиденного поведения во время выполнения все поля сервлета должны быть статическими и / или окончательными или просто удалены.

EDIT

Я обнаружил похожую проблему , исправленную в @Inject Java, которая не должна вызывать это предупреждение

На практике, когда поле помечено @Inject, оно не будет видоизменено. Таким образом, поля, отмеченные этой аннотацией, не должны вызывать проблему RSPEC-2226.

РЕДАКТИРОВАТЬ 2

Открыть потенциальную ложную положительную проблему в SonarSource Community

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Я считаю, что вы правы, это ложно-положительный вопрос, проблема не должна подниматься в этом поле так же, как и в полях, помеченных @Inject, @Resource или @ EJB.

Iсоздать проблему, чтобы исправить это поведение https://jira.sonarsource.com/browse/SONARJAVA-2895

0 голосов
/ 17 сентября 2018

По моему мнению, вы должны полностью отказаться от AutowireCapableBeanFactory. Вместо этого вы должны зарегистрировать свой сервлет следующим образом

 @Bean
 public ServletRegistrationBean yourServlet(MyBean mybean) {
      // initialize your Servlet here  = new YourServlet(myBean);
      //register it to as ServletRegistrationBean
    return servletRegistration;
 }

Эта регистрация предполагает, что у вас уже есть MyBean в контексте приложения Spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...