#java #serialization #cdi #weld
#java #сериализация #cdi #сварка
Вопрос:
Я создаю приложение JSF. Приложение JSF содержит некоторые компоненты CDI, которые содержат данные сеанса. Я хочу сохранить данные этого сеанса в файл и загрузить его позже.
Пример 1:
@SessionScoped
MyBean implements Serializable {
private String myValue;
//getter and setters
}
@RequestScoped
MyLoadingService {
@Inject
private MyBean myBean;
public void load(byte[] data){
MyBean newMyBean = (MyBean)org.apache.commons.lang3.SerializationUtils.deserialize(data);
//this doesn't work, because myBean is a proxy here...
//how can I achieve this to work?
myBean = newMyBean;
}
}
Пример 2:
Компонент в области сеанса, который содержит другой компонент, который должен быть загружен.
@SessionScoped
AnotherBean implements Serializable {
private String otherValue;
//getter and setters
}
@SessionScoped
MyBean implements Serializable {
@Inject
AnotherBean anotherBean;
private String myValue;
//getter and setters
}
@RequestScoped
MyLoadingService {
@Inject
private MyBean myBean;
public void load(byte[] data){
MyBean newMyBean = (MyBean)org.apache.commons.lang3.SerializationUtils.deserialize(data);
//this doesn't work, because myBean is a proxy here...
//how can I achieve this to work?
myBean = newMyBean;
}
}
Возможно ли это?
Комментарии:
1. CDI предполагает, что контейнер отвечает за все, включая сериализацию.
Ответ №1:
Класс может быть сериализован или нет, независимо от используемой вами платформы. CDI и JSF не имеют отношения к вашей проблеме. Просто убедитесь, что ваш класс и все его поля могут быть сериализованы / десериализованы, если у вас есть поле, которое нельзя сериализовать, затем пометьте его как transient
и установите правила для его создания при десериализации объекта путем реализации readObject
метода.
Примечание: существуют серверы приложений, которые включают эту опцию для вас: сохраните данные сеанса в файле на диске, чтобы загрузить его позже после повторного развертывания приложения, например, JBoss (я тестировал это поведение в JBoss AS 7). Нет необходимости изобретать велосипед.
Комментарии:
1. Вопрос не в том, можно ли сериализовать объект, а в том, как я могу десериализовать компонент и при этом сохранить работу CDI. Или, если это вообще возможно. CDI сам управляет жизненным циклом компонента, я не знаю, возможно ли переопределить компонент, который уже управляется CDI, не нарушая управление жизненным циклом.
2. Попробуйте это:
Session session = /* fancy code to get the session */; session.setAttribute("<name of your CDI sessionscoper bean>", <new instance of the session scoped bean which has the external beans injected>);
.3. Кстати, вы никогда не публиковали свою реальную проблему в вопросе. Вот почему мой ответ касается сериализации объектов Java.