2015-11-05 4 views
2

У меня есть EJB ActionService, который я могу впрыскивать в другие EJB, который работает нормально.EJB не может вводить другие EJB

Теперь я создал еще один EJB:

@Stateless 
public class ActionsPerDateDataSet extends ScriptedDataSetEventAdapter {  
    @EJB 
    ActionService actionService; 

@Override 
public void open(IDataSetInstance dataSet) { 
     actionService.foo() // However actionService is null here! 
    } 
} 

Где ScriptedDataSetEventAdapter приходит из другой структуры (BIRT). Однако сейчас мой actionService всегда null. Я не могу понять, почему

+0

Как именно вы сами ввели «ActionsPerDateDataset»? Через '@ EJB' право? Или вы вручную создавали его экземпляр (или пусть BRIT вручную создает его экземпляр)? Независимо от того, где именно вы пытаетесь получить доступ к 'actionService'? Может быть, в конструкторе? – BalusC

+0

И сервер приложений? – George

+0

Glassfish v3.1. Birt создает экземпляр – matthias

ответ

0
  1. Вы пытались использовать CDI? Я думаю, что это стоит того. Вам нужно поместить пустой beans.xml в вашу папку meta-inf и изменить @EJB на @Inject. Но единственный способ, которым это могло бы работать, - это иметь внешнюю библиотеку и файл war/jar в том же подразделении развертывания.

  2. , если это не работает, вам нужно будет использовать JNDI для поиска вашего компонента: http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html

0

Вполне возможно, что класс ScriptedDataSetEventAdapter не может быть инициализирован в EJB контейнер (первая часть цикла) , и поскольку инициализация неверна, инъекции зависимостей (@EJB и @Inject) не выполняются.

Что вы можете сделать, это изменить дизайн своего EJB, и вместо этого он расширяет «ScriptedDataSetEventAdapter» , чтобы изменить его на композицию.

@Stateless 
public class ActionsPerDateDataSet {  

    ScriptedDataSetEventAdapter scriptedDataSetEventAdapter; 

    @EJB 
    ActionService actionService; 

    @PostConstruct 
    public void init(){ 
     try { 
      scriptedDataSetEventAdapter = new ScriptedDataSetEventAdapter(); 
     } catch(AppException e){ 
     } 
    } 

@Override 
public void open(IDataSetInstance dataSet) { 
     actionService.foo() // However actionService is null here! 
    } 
} 
1

Вы должны ввести LIB как ejbModule в файле ухо, так что контейнер поиска .jar файл и развернуть его и ввести его, когда он нуждается в

1

ActionService имеет интерфейс с @LOCAL аннотации, или если это это класс, который должен иметь аннотацию @LocalBean.

(это, чтобы иметь возможность получить доступ к экземпляру этого во время выполнения)

В случае интерфейс и, если он имеет несколько реализаций вы будете ссылаться на реализацию вам нужно с помощью @EJB (beanName = " nameOfImplementation ") в случае, если это класс, где @LocalBean используется для использования @EJB (имя =„nameEjb“)

интерфейс с @LOCAL класса с @LocalBean

в агрегации класса интерфейс с многочисленными реализация @EJB (beanName = "nameOfImplementation «) Класс @EJB (имя =» nameEjb ")

Примечание: реализует интерфейс для ActionService с @LOCAL и тест примечание: добавить след журнала консоли, чтобы узнать, если класс инициализируется как EJB: ActionService

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