2014-01-15 3 views
1

Я переношу большое приложение в CDI с JPA. Прежде чем я смогу изменить весь код, мне нужно знать, будет ли работать следующий шаблон. Это позволит мне частично перенести приложение.Могу ли я создать экземпляр именного фаната без имени?

управляемого Bean:

@Named 
@Stateless 
public class LanguageBoundary implements Serializable { 

    @Inject 
    LanguageService languageService; 

    @Inject 
    CrudService crudService; 

    public LanguageEntity findById(Long id) { 
     return crudService.find(LanguageEntity.class, id); 
    } 

...

Могу ли я использовать в любом другом классе:

// Methods: DAO - Used by original deprecated parent wrapper class 
public LanguageEntity findByIdImpl(Id id) { 

    LanguageBoundary lb = new LanguageBoundary(); 
    return lb.findById(id.getValue()); 
} 

Спасибо за совет.

ответ

2

Чтобы сделать что-то подобное, вам нужно получить ссылку на объект. Вы можете сделать это с помощью CDI. В CDI 1.1 вы можете получить класс утилиты CDI. В CDI 1.0 вы можете получить ссылку на менеджер компонентов, используя JNDI, чтобы сделать эквивалент. Посмотрите на этот код для справки: https://github.com/apache/deltaspike/blob/master/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java#L98

Мне любопытно, почему вы используете @Named. Планируете ли вы ссылаться на EJB непосредственно в пользовательском интерфейсе?

+0

Мне так любопытно, как Джон. «@Named» объявляет список CDI видимым для веб-страниц через EL, где «@Stateless» объявляет контейнерный компонент EJB. Разделение проблем не способствует смешиванию обоих. Кроме того, не рекомендуется проверять компоненты EJB на уровне пользовательского интерфейса. – Sam

4

Если вы создаете экземпляр, этот компонент не будет управляться контейнером, поэтому это, вероятно, не то, что вы хотите. Вместо этого вы должны ввести его @Inject

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