2015-06-16 5 views
0

Я попытался внедрить Entity EJB (Facade и сущность из базы данных MySQL), но он не работает в зависимости от класса, в котором он находится. Я использую Rest WebService, и он работает в класс webService. Я использую многоуровневую архитектуру, и я не хочу, чтобы мой EJB был введен в этот веб-сервис.EJB injection не работает в разных классах

Итак, это @Stateless фасад:

public class ActivityEntityFacade extends AbstractFacade<ActivityEntity> { 
@PersistenceContext(unitName = "persistance") 
private EntityManager em; 

@Override 
protected EntityManager getEntityManager() { 
    return em; 
} 

public ActivityEntityFacade() { 
    super(ActivityEntity.class); 
} 

}

это остальное метод WebService работы с EJB:

@EJB 
private ActivityEntityFacade activityfacade; 

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/{date}") 
public List<ActivityEntity> activities(@PathParam("date") String date){ 
    List<ActivityEntity> activityList = activityfacade.findAll(); 
    return activityList; 
} 

И это мой activityManager, который, как предполагается, для работы с EJB и предполагается вернуть этот список на другой уровень:

public class ActivityManager implements Serializable, IActivity { 

@EJB 
private ActivityEntityFacade activityfacade; 

public ActivityManager(){ 
} 

public List<ActivityEntity> selectAll(){ 
    return activityfacade.findAll(); 
} 

}

Это snipet возвращение NullPointerException на activityEntityFacade. Вы не знаете, почему это не работает в этом случае?

EDIT: экземпляр activityManager создается в предыдущем слое:

class ServActivityConsult implements IActivable{ 

@Override 
public List<ActivityEntity> activityList() { 
    IActivity managerActivity = new ActivityManager(); 
    return managerActivity.selectAll(); 
} 

public ServActivityConsult(){ 
} 

}

Но ошибка приходят от возвращения activityfacade.findAll В ActivityManager в нашем случае.

+2

Как вы получаете экземпляр ActivityManager? –

ответ

1

Вы сами создаете ActivityManager, используя new ActivityManager(). Таким образом, применяются основные правила Java: вызывается конструктор, и поскольку он не влияет на какое-либо значение до activityfacade, это поле имеет значение null.

Для инъекции зависимостей вы не можете создавать объекты самостоятельно, а получать их из контейнера. Таким образом, ваш класс должен выглядеть так:

public class ServActivityConsult implements IActivable{ 

    @Inject 
    private ActivityManager activityManager; 

    @Override 
    public List<ActivityEntity> activityList() { 
     return activityManager.selectAll(); 
    } 
} 

И этот класс сам должен быть введен в контроллер Джерси или EJB.

+0

Я попытался ввести activityManager в ServActivityConsult с помощью Inject и попытался внедрить ServActivityConsult в класс webService с EJB, и у меня получилась следующая ошибка: Avertissement: StandardWrapperValve [Служба Джерси-REST]: Servlet.service() для сервлета. Служба REST Джерси выбрала исключение javax.naming.NameNotFoundException: com.pdf.businessServices.activity.ServActivityConsult # com.pdf.businessServices.activity.ServActivityConsult не найден –

+1

ServActivityConsult не является EJB. Поэтому не используйте '@ EJB' для его ввода. Используйте '@ Inject'. –

+0

спасибо, он работает: D –

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