setServletContext не активируется внутри файла @Configuration - PullRequest
0 голосов
/ 03 мая 2018

Итак, это что-то вроде продолжения этого вопроса . Мой текущий код выглядит примерно так:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"base.pkg.name"})
public class MyApp implements ServletContextAware {

    private ThingDAO beanThingDAO = null;

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

    @Bean publicD ThingDAO getBeanThingDAO() { return beanThingDAO; }

    public void setServletContext(ServletContext servletContext) {
        // all references to servletContext go here, including the
        // bit where we call the appropriate setters in beanThingDAO
    {
}

Проблема в том, что она не работает. В частности, я понимаю, что setServletContext должен был вызываться различными формами Spring Magic в какой-то момент в процессе запуска, но (как показывает System.out.println ()) он никогда не вызывается. Я пытаюсь завершить первый этап основного процесса рефакторинга, и на данный момент для меня очень важно иметь возможность обрабатывать доступ к servletContext полностью внутри файла @Configuration. Я не ищу ответ, который скажет мне, что я должен поместить его в контроллеры. Я ищу ответ, который либо подскажет мне, как заставить его работать внутри файла @Configuration, либо объяснит, почему это не сработает, и что я могу с этим поделать.

1 Ответ

0 голосов
/ 04 мая 2018

Ну, у меня есть ответ. Это не тот случай, которым я особенно доволен, поэтому я не приму его, но если кто-то с такой же проблемой сталкивается с этим вопросом, я хочу, по крайней мере, воспользоваться им своим опытом.

По какой-то причине автоматический вызов ServletContextAware просто не работает при таких обстоятельствах. Это работает практически для всех остальных компонентов. Я создал класс Kludge, который выглядит примерно так:

// This class's only purpose is to act as a kludge to in some way get
// around the fact that ServletContextAware doesn't seem to work on MyApp.
// none of the *other* spring boot ways of getting the servlet context into a
// file seem to work either.
@Component
public class ServletContextSetter implements ServletContextAware {

    private MyApp app;

    public ServletContextSetter(MyApp app) {
        this.app = app;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        app.setServletContext(servletContext);
    }
}

делает работу. Мне это не нравится, и я буду восстанавливать вещи позже, чтобы сделать это ненужным, чтобы я мог вынуть его, но это работает. Я собираюсь держать галочку, однако, в случае, если кто-нибудь может сказать мне, как заставить его работать полностью внутри файла, украшенного @Configuration, или почему он там не работает.

Обратите внимание, что здесь важен декоратор @Component. Без этого не получится.

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