Согласно ветке комментариев в принятом ответе Артура. Я следовал этому блогу , а также этому блогу , чтобы провести эксперимент по пассивации / активации. Эксперимент подтвердил комментарий MrD, что переходное свойство при активации будет иметь значение NULL. Таким образом, чтобы иметь дело с несериализуемыми свойствами-членами bean-компонента, способного к пассивации (а именно, сессионного контекста, сеансового контекста и сессионного компонента с состоянием), я предлагаю следующее решение:
private ResourceBundle bundle;
@PostConstruct
@PostActivate
public void getResourceBundle() {
bundle = ResourceBundle.getBundle("/messages", locale );
}
Это решение обеспечивает повторную инициализацию несериализуемых членов свойства при каждом переходе в состояние READY.
Последний вопрос по адресу
Последней проблемой, которую необходимо решить, является внедрение регистратора SLF4j, который не был сериализуемым до slf4j 1.5.3, и я цитирую :
Начиная с SLF4J версии 1.5.3, экземпляры регистратора выдерживают сериализацию.
Таким образом, сериализация класса хоста больше не требует специальных
действие, даже если регистраторы объявлены как переменные экземпляра.
Таким образом, если ваша зависимость slf4j составляет 1.5.3 или более поздней, вы можете безопасно внедрить регистратор SLF4j следующим образом:
@Produces
@LogbackLogger
public Logger produceLogger(InjectionPoint injectionPoint){
return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
Предположим, вы указали квалификатор:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface LogbackLogger {
}
Затем в bean-компоненте, способном к пассивации, ввести следующее:
@Inject
@LogbackLogger
private Logger logger;