WebApplicationInitializer с профилями Spring и конфигурацией на основе аннотаций - PullRequest
0 голосов
/ 04 июня 2018

Когда мы недавно развернули второе весеннее приложение на том же Tomcat, у нас возникли проблемы с неожиданным взаимодействием.

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

Нет недостатка в примерах использования инициализации Servlet 3.0 в Spring.Однако я не могу найти ни одного, который бы использовал профили Spring и инициализацию контекста на основе аннотации @Configuration.

После большой боли я остановился на этом:

AnnotationConfigWebApplicationContext rootApplicationContext = new AnnotationConfigWebApplicationContext();

    String [] activeProfiles = {"root","oracle"};
    rootApplicationContext.getEnvironment().setActiveProfiles(activeProfiles);
    rootApplicationContext.scan("com.xxx.restserver.config");


    // Create the dispatcher servlet's application context

    AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
    String[] dispatcherActiveProfiles = {"web"};
    dispatcherContext.getEnvironment().setActiveProfiles(dispatcherActiveProfiles);
    dispatcherContext.setParent(rootApplicationContext);
    dispatcherContext.scan("com.xxx.restserver.config");

    // Managed the lifecycle of the application context
    servletContext.addListener(new ContextLoaderListener(rootApplicationContext));


    // Register and map the dispatcher Servlet
    ServletRegistration.Dynamic dispatcher =
        servletContext.addServlet("Dispatcher", new DispatcherServlet(dispatcherContext));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");

Единственная проблема заключается в том, что файлы корневого контекста @configuration "обрабатываются" дважды.Один раз при сканировании, а затем снова при создании экземпляра ContextLoaderListener.Я использую кавычки, потому что в первый раз происходит некоторая инициализация, но контекст не остается в пригодном для использования состоянии.

Я поиграл с context.refresh (), но это сильно ухудшило ситуацию.

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

...