Возможно ли, чтобы в CDI Passivation Capable bean-компоненты, не поддерживающие пассивацию, были повторно введены, а не пассивированы?

Возможно ли, чтобы в CDI Passivation Capable bean-компоненты, не поддерживающие пассивацию, были повторно введены, а не пассивированы?

Рассмотрим этот код:

@SessionScoped
public class UserData implements Serializable {
  @Inject
  private Logger log;
  private String data;
}


@ApplicationScoped
public class LoggerFactory {
  @Produces
  public Logger getLogger(){
  ...
  }
}

public class Logger {
...
}

Итак, Logger не Serializable, но мне все равно. Когда UserData десериализуется, возможно ли как-то снова вызвать производителя для Logger?

РЕДАКТИРОВАТЬ

Первоначальное обсуждение началось здесь:

http://www.cdi-spec.org/news/2015/07/03/CDI-2_0-EDR1-released/#comment-2119769909

Надеюсь, группа экспертов CDI найдет лучший способ, чем @Instance


person Jonathan S. Fisher    schedule 06.07.2015    source источник
comment
Много причин... Что, если вы внедряете EJB? Должен ли он быть сериализуемым? А как насчет SFL4J? Logger не расширяет Serializable.   -  person Jonathan S. Fisher    schedule 06.07.2015
comment
CDI и EJB генерируют и внедряют сериализуемые прокси-серверы, далее делегируя доступному в данный момент (и автоматически созданному) экземпляру для каждого потока. Или вы столкнулись с NotSerializableException?   -  person BalusC    schedule 06.07.2015
comment
CDI жалуется во время загрузки, что некоторые из внедряемых зависимостей не поддерживают пассивацию. Что кажется нелепым, поскольку он создает для них прокси!   -  person Jonathan S. Fisher    schedule 06.07.2015
comment
Никогда не сталкивался с теми, у кого есть Weld.   -  person BalusC    schedule 06.07.2015
comment
:( Какую версию сварки вы используете? Я использую TomEE, который является OWB, и я думаю, что CDI 1.0   -  person Jonathan S. Fisher    schedule 06.07.2015
comment
EJB имеет аннотацию метода @PostActivate, которая помогает. Разве нет эквивалента CID?   -  person bruno    schedule 25.07.2018
comment
@BalusC, вот почему: некоторые bean-компоненты инициализируют несериализуемые поля на основе данных в полях @Injected, и это делается в методе @PostConstruct. Мы хотим сделать это после активации.   -  person bruno    schedule 25.07.2018


Ответы (1)


Проверив спецификацию, вы получите ответ. Logger не сериализуем, поэтому bean-компонент типа Logger не поддерживает пассивацию. Контейнер не обеспечивает трюк, который вы запрашиваете.

Решением было бы написать что-то вроде этого:

@SessionScoped
public class UserData implements Serializable {
  @Inject
  private Instance<Logger> logInstance;
  private String data;

  public Logger getLog() {
   return logInstance.get();
  }
}

В коде используйте getLog() вместо log.

person Antoine Sabot-Durand    schedule 06.07.2015
comment
Почему контейнер не предоставляет сериализуемый прокси? (как и почти во всем остальном) - person Jonathan S. Fisher; 07.07.2015