Как обновить контекст Spring при использовании CXF? - PullRequest
0 голосов
/ 08 февраля 2012

У нас есть веб-приложение, которое использует Spring (3.0.5) и CXF (в настоящее время это 2.4.2 по разным причинам, но обновление имеет значение, если это имеет какое-то значение) и развернуто на Tomcat.

Приложение инициализируется с использованием org.springframework.web.context.ContextLoaderListener .

Запуск и закрытие приложения работает как чудо, но если я пытаюсь обновить контекст приложения Spring, используя

((ConfigurableApplicationContext)applicationContext).refresh();

У меня проблемы. Сначала контекст приложения уничтожает все его bean-компоненты (включая CXFBusImpl или, вернее, его подкласс SpringBus ). Однако SpringBus вызывает метод close () для своего контекста приложения, что приводит к исключению NullPointerException, когда контекст приложения вскоре после этого пытается закрыть свою фабрику компонентов:

java.lang.NullPointerException
    at org.springframework.context.support.AbstractRefreshableApplicationContext.closeBeanFactory(AbstractRefreshableApplicationContext.java:152)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:124)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)

Есть ли что-нибудь, что я могу сделать, чтобы избежать этого (кроме изменения CXF)? Если я пропущу CXF, все будет работать.

1 Ответ

0 голосов
/ 09 февраля 2012

Я не думаю, что вы можете сказать CXF не работать таким образом.Однако вы могли бы выделить части вашего приложения, которые необходимо перезапустить, в их собственный контекст, который вы создаете и разбираете по своему усмотрению, не затрагивая при этом основной контекст.Возможно, вы бы сделали это с ClassPathXmlApplicationContext, хотя есть несколько вариантов.Я думаю вы будете устанавливать внешний контекст в качестве родителя внутреннего и ссылаться на внешние bean-компоненты с синтаксисом XML-config , например:

<ref parent="foo" />

Затем вам нужно будет создать способ передачи действия с CXF во внешнем контексте бинам во внутреннем контексте.Это сложная часть, так как ссылки на нее обычно считаются плохими.Вероятно, вам понадобится какой-то реестр / прокси во внешнем контексте, к которому (соответствующие) внутренние компоненты подключаются как часть процесса их создания / инициализации (и отмены регистрации при разрыве).Вы также должны решить, как обрабатывать случай, когда запрос должен быть обработан, когда нет внутреннего контекста.Хитро, особенно если вы хотите сделать это элегантно ...

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