2015-09-24 6 views
1

Ожидает ответа.Интерфейс-EJB не инжектирован в no-interface-EJB

У меня есть контроллер JAX-RS (Jersey 2.21 на WildFly 9.0).

@Named 
@Path("v1/populateList/") 
public class PopulateDataController { 

    @EJB 
    ListItemService listItemService; 

    @GET 
    @Path("auto") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String populateList(){ 
     listItemService.populateList(); 
     return "done"; 
    } 
} 

Ниже ListItemService нет-интерфейса EJB не будет успешно введен в контроллере выше JAX-RS.

@Stateless 
public class ListItemService { 

    @EJB 
    ListItemDao listItemDao; 

    public void populateList(){ 
     listItemDao.persist(); 
    } 
} 

Тем не менее, ниже ListItemDaoImpl интерфейс-EJB не в свою очередь инъецируют в выше не-интерфейса EJB.

@Stateless 
public class ListItemDaoImpl implements ListItemDao{ 

    @PersistenceContext(unitName = "pu") 
    private EntityManager em; 

    public void persist(){ 
     ListItem listItem = new ListItem(); 
     listItem.setLevel(1); 
     listItem.setName("item1"); 
     em.persist(listItem); 
    } 
} 

listItemDao остается в populateList() методом ListItemServicenull, вызывая NullPointerException.

Как это вызвано и как я могу его решить?

--- Редактирование и обновление ---

Я попытался сделать боб Singleton для запуска при запуске (чтобы проверить мое приложение логики). Он отлично работает без JAX RS. Поэтому ясно, что проблема связана не с EJB, а с JAX RS. (поправьте меня, если ошибаюсь)

@Singleton 
    @Startup 
    public class TestController { 
     @EJB 
     ListItemService listItemService; 

     @PostConstruct 
     void test(){ 
     System.out.println("starting.........."); 
     listItemService.populateList(); 
     System.out.println("ending.........."); 
     } 

    } 
+0

Вы комментировали свой интерфейс ListItemDao с помощью функции @Local? – Szarpul

+0

@BalusC Спасибо за исправление моего вопроса – Mab

+0

@Szarpul да. '@Local public interface ListItemDao { void persist(); } ' – Mab

ответ

0

Создание следующий класс помог.

@javax.ws.rs.ApplicationPath("api") 
    public class InjectionApplication extends javax.ws.rs.core.Application { 
     private Set<Object> singletons = new HashSet<Object>(); 
     private Set<Class<?>> classes = new HashSet<Class<?>>(); 

     public InjectionApplication() { 
     // no instance is created, just class is listed 
     classes.add(ListItemController.class); //replace with yours 
     classes.add(ParseFeedController.class); //replace with yours 
     //add more or use some auto class finding technique 

     } 

     @Override 
     public Set<Class<?>> getClasses() { 
     return classes; 
     } 

     @Override 
     public Set<Object> getSingletons() { 
     return singletons; 
     } 
    } 
Смежные вопросы