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

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

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

@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/

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

1 ответ

Решение

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

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

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

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

Использование getLog() вместо log в вашем коде.

Другие вопросы по тегам