Как получить доступ к ServletContext внутри класса @Configuration или @SpringBootApplication - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь обновить старое приложение Spring. В частности, я пытаюсь извлечь все bean-компоненты из старой формы, определенной в xml, и перетащить их в формат @SpringBootApplication (при этом значительно сокращая общее количество определенных bean-компонентов, потому что многим из них не нужно было фасоль). Моя текущая проблема заключается в том, что я не могу понять, как сделать ServletContext доступным для bean-компонентов, которым он нужен.

Мой текущий код выглядит примерно так:

package thing;

import stuff

@SpringBootApplication
public class MyApp {

    private BeanThing beanThing = null;

    @Autowired
    private ServletContext servletContext; 

    public MyApp() {
        // Lots of stuff goes here.
        // no reference to servletContext, though
        // beanThing gets initialized, and mostly populated.
    }

    @Bean public BeanThing getBeanThing() { return beanThing; }

    @PostConstruct
    public void populateContext() {
        // all references to servletContext go here, including the
        // bit where we call the appropriate setters in beanThing
    }
}

Ошибка, которую я получаю обратно: Field servletContext in thing.MyApp required a bean of type 'javax.servlet.ServletContext' that could not be found.

Так ... что мне не хватает? Есть ли что-то, что я должен добавить к пути? Какой интерфейс мне нужно реализовать? Я не могу предоставить бин сам, потому что весь смысл в том, что я пытаюсь получить доступ к контекстной информации сервлета (строки getContextPath () и getRealPath ()), которой у меня нет.

1 Ответ

0 голосов
/ 26 апреля 2018

Пожалуйста, помните о лучших методах доступа к ServletContext: Вы не должны делать это в своем основном классе приложений, но e. г. контроллер.

В противном случае попробуйте следующее:

Реализуйте интерфейс ServletContextAware, и Spring сделает это за вас.

Удалить @Autowired для переменной.

Добавить setServletContext метод.

@SpringBootApplication
public class MyApp implements ServletContextAware {

    private BeanThing beanThing = null;

    private ServletContext servletContext; 

    public MyApp() {
        // Lots of stuff goes here.
        // no reference to servletContext, though
        // beanThing gets initialized, and mostly populated.
    }

    @Bean public BeanThing getBeanThing() { return beanThing; }

    @PostConstruct
    public void populateContext() {
        // all references to servletContext go here, including the
        // bit where we call the appropriate setters in beanThing
    }

    public void setServletContext(ServletContext servletContext) {
        this.context = servletContext;
    }


}
...