Десериализованному бобу нужны зависимые области - PullRequest
1 голос
/ 25 февраля 2010

Как я могу внедрить зависимости в десериализованный компонент?

Некоторые из моих bean-компонентов Spring должны быть сериализованы на этапе рендеринга-ответа нашего приложения JSF, а затем десериализованы в начале следующего запроса. Некоторые из этих bean-компонентов имеют зависимости, которые ограничиваются запросом. Если я настраиваю зависимости с помощью прокси-сервера с областью действия ("<aop:scoped-proxy>"), я не могу сериализовать зависимые компоненты - прокси-сервер не сериализуем.

Итак, сейчас мы делаем это, объявляя соответствующие переменные-члены сериализованных классов bean-компонентов как переходные, а затем вызываем context.getAutowireCapableBeanFactory().configureBean(bean, name) сразу после десериализации bean-компонентов - но это отстой, потому что инициализатор bean-компонента вызывается снова. (Что касается других зависимостей, которые находятся в той же области видимости, не являются переходными и десериализованы, я даже не уверен, почему они не перезаписываются configureBean, но я не думаю, что они есть.)

Что лучше? Должен ли я просто получить определение компонента, пройтись по нему, найти зависимости, ограниченные областью запроса, а затем вызвать getBean(name) в контексте?

(Кстати, я не уверен, что это что-то меняет, но мы используем Spring довольно странно. Мы создаем новый класс ClassPathXmlApplicationContext для каждого неопубликованного HTTP-запроса, а не один WebApplicationContext. постбэк, мы десериализовали bean-компоненты. Поэтому, когда я говорю «scoped to the request», я вру; эти bean-объекты на самом деле имеют синглтонную область. Я хотел бы использовать WebApplicationContext и более разумную область видимости с ним, но насколько как я могу сказать, это ортогонально нашей проблеме на данный момент.)

1 Ответ

0 голосов
/ 25 февраля 2010

Это все меняет - я использовал Spring с JSF довольно долгое время и у меня не было проблем с сериализацией. Для этого просто укажите следующее в вашем faces-config.xml:

<el-resolver>
   org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>

Это объединяет пружину с JSF, предоставляя пружинные бобы (с использованием пружинных областей request и session) для страниц JSF.

Итак, я бы посоветовал радикально изменить ваш подход, чтобы в будущем не возникало подобных проблем.

...