2015-05-12 2 views
2

У меня есть сеансовый компонент для пользовательского интерфейса для редактирования некоторых данных. Он аннотируется с @Named и @SessionScoped, и все работает в JBoss 6.2. Теперь я получил требование для почти аналогичного пользовательского интерфейса редактирования. Проблема в том, что два пользовательских интерфейса могут существовать параллельно. Поэтому для идеального повторного использования было бы неплохо создать новый экземпляр компонента с другим именем. К сожалению, я понятия не имею, как это сделать чистым способом CDI. Мне не нравится так много, чтобы наследовать от боба и дать другое имя. Это была одна из моих идей. Другая идея заключалась в том, чтобы реализовать в управляемом компоненте только бизнес-логику и сохранить данные, инкапсулированные из них, и установить объект данных внутри управляемого компонента, когда это необходимо в конкретном контексте. Но может быть, есть еще один CDI-способ с продюсерами или что-то еще? Изменение объема компонента в ViewScope не имеет смысла в моем случае.Получите новый экземпляр компонента, связанного с сеансом, с другим именем

Благодаря Оливер

+0

Стараюсь подход для повторного использования кода других компонентов, создавая их в новом управляемом компоненте в @PostConstruct. Наследовать и давать новое имя не является хорошей идеей и приводит к проблеме с cdi, чтобы выбрать правильный экземпляр. – opfau

+0

Почему не BeanB не расширяет BeanA? –

+0

В этом случае для CDI не указывается, какой экземпляр вводится. BeanA или BeanB. Я тоже не большой поклонник наследования. Только если это имеет смысл. – opfau

ответ

2

Но, может быть, есть другой способ CDI с производителями или что-то

В самом деле, вы могли использовать производителя.

Kickoff пример:

@SessionScoped 
public class SessionBean { 

    @Produces 
    @Named("foo") 
    @SessionScoped 
    public SessionBean getAsFoo() { 
     return new SessionBean(); 
    } 

    @Produces 
    @Named("bar") 
    @SessionScoped 
    public SessionBean getAsBar() { 
     return new SessionBean(); 
    } 

    // ... 
} 

(имена методов бесплатно на ваш выбор)

Использование:

@Inject 
@Named("foo") 
private SessionBean foo; 
@Inject 
@Named("bar") 
private SessionBean bar; 
+0

Спасибо. Это приятно и увеличивает мою внутреннюю библиотеку CDI :) – opfau

+0

Добро пожаловать. – BalusC

+0

Возможно ли, что CDI создает экземпляры SessionBean? Если новый оператор используется, инъекции внутри SessionBean, вероятно, мне нужно будет восстановить и установить самостоятельно. – opfau

Смежные вопросы