Spring3 десериализация - инъекция синглтона - PullRequest
2 голосов
/ 24 января 2012

Я занимаюсь разработкой веб-приложения с JSF2 и Spring3, и у меня возникла проблема с десериализацией.

У меня есть некоторые bean-объекты в сессионной области, определенные так:

@Controller(value = "admin")
@Scope(value = "session")
public class AdminBean implements Serializable {
...

Также у меня есть некоторые синглеты, определенные так:

@Repository
public class Repo {

Синглтоны вводятся в сессию-боб вроде этого

@Resource
private transient Repo repo;

После того как я добавил transient, мои проблемы с сериализацией / десериализацией исчезли.Но теперь у меня проблема в том, что после десериализации зависимости (repo в этом случае) равны нулю.Я много искал по этой проблеме и нашел некоторые обходные пути, но мне все еще интересно, что является лучшим решением для этой проблемы?

Мне кажется, что использование bean-компонентов на уровне приложения в сессионных компонентах является довольно распространенным случаем, разве нет чистого решения для этого?Я нашел решение с @Configurable, но действительно ли мне нужны некоторые вещи, связанные с загрузкой?Цели инъекции уже подпружинены, поэтому для меня это не имеет смысла .. Пожалуйста, сообщите мне

обновление 2 года спустя : Вы МОЖЕТЕ прозрачно внедрить bean-объекты в рамках сеансав application-scoped-bean (хотя в большинстве случаев это может быть не очень хорошей идеей).Мне просто нужно было установить proxyMode на @Scope соответственно.

Ответы [ 2 ]

1 голос
/ 24 января 2012

Попробуйте получить от AutowireCapableBeanFactory до applicationContext.getAutowireCapableBeanFactory(), и есть некоторые методы, такие как autowireBeanProperties, autowireBean и configureBean, которые должны быть в состоянии перенастроить ваш бан после десериализации. Выберите наиболее подходящий для вас метод (один из них запускает постобработку, а другой нет и т. Д.)

Вторая идея - обернуть Repo в прокси, который можно сериализовать. Он будет сериализован с AdminBean и десериализован. Этот прокси должен содержать «реальную» временную ссылку и, если он становится нулевым после десериализации, он должен искать его в контексте приложения.

Я слышал, что Spring 3 автоматически оборачивает бины таким прокси, но мне так и не удалось заставить его работать.

0 голосов
/ 24 января 2012

Я столкнулся с подобной проблемой, используя @ViewScoped из JSF, где компонент поддержки должен быть сериализуемым, который, в свою очередь, хочет, чтобы все зависимости были сериализуемыми, что во всех сценариях невозможно получить все. Как упомянул @Peter о Spring 3, взгляните на link @ stackoverflow, обсуждая то же самое здесь . Я использовал переходные процессы для некоторых зависимостей (Spring) и для процесса десериализации я подключил bean-компонент к

private void writeObject(java.io.ObjectOutputStream stream) and private void readObject(java.io.ObjectInputStream stream)

в поле зрения скопировал боб и настроил его, чтобы получить правильную ссылку.

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