2015-07-06 9 views
3

В пассивировании CDI Способный компонент, возможно ли, чтобы зависимые от пассивации зависимости были повторно введены, а не пассивированы?В пассивировании 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?

EDIT

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

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

Надеясь группа CDI Expert придумывает лучше, чем @Instance

+0

Почему? – BalusC

+0

Множество причин ... Что делать, если вы вводите EJB? Нужно ли это также сериализовать? Что относительно SFL4J? Logger не расширяет Serializable. –

+0

CDI и EJB генерируют и вводят сериализуемые прокси-серверы, делегирующие далее доступный (и автоматически созданный) экземпляр в потоковой основе. Или вы столкнулись с «NotSerializableException»? – BalusC

ответ

2

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

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

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

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

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

+0

Почему контейнер не предоставляет сериализуемый прокси? (Как и для всего остального) –