2016-07-23 5 views
0

Моя цель высокого уровня - использовать код JPA, сгенерированный NetBeans, с помощью мастера «RESTful web services from the database» в моих сервлетах.Как я могу вставить сессионный компонент без состояния в сервлет?

Чтобы быть более точным, я хотел бы получить доступ к фасаду непосредственно из сервлета, чтобы не загружать некоторые данные с помощью JavaScript на стороне клиента.

Соответствующая часть моего фасада выглядит следующим образом:

@Stateless 
@Path("wgm.rest.balanceview") 
public class BalanceViewFacadeREST extends AbstractFacade<BalanceView> { 

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

    @GET 
    @Override 
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
    public List<BalanceView> findAll() { 
    return super.findAll(); 
    } 

} 

Теперь я попытался следующее:

@WebServlet(name = "BalanceServlet", urlPatterns = "/balance/*") 
public class BalanceServlet extends HttpServlet { 

    @Inject 
    private BalanceViewFacadeREST balanceFacade; 


    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws 
    ServletException, IOException { 
    List<BalanceView> balances = balanceFacade.findAll(); 
    // ... 
    } 
} 

Однако при развертывании GlassFish, я получаю следующее исключение:

java.lang.RuntimeException: Unable to load the EJB module. DeploymentContext does not contain any EJB. Check the archive to ensure correct packaging for /home/severin/Projects/WGManager/build/web. 
If you use EJB component annotations to define the EJB, and an ejb or web deployment descriptor is also used, please make sure that the deployment descriptor references a Java EE 5 or higher version schema, and that the metadata-complete attribute is not set to true, so the component annotations can be processed as expected 

Это звучит так, как если бы инжектор не мог найти BalanceViewFacadeREST. Что мне не хватает?

ответ

2

Я предполагаю, что вы Servlet и ваш EJB локальны друг другу. Моя презумпция основана на том, что ваш EJB не имеет удаленного интерфейса.

Если Servlet и EJB находятся в одном контейнере, вы можете просто анотетировать с помощью @EJB или @Inject, если у вас есть инъекция Context и Dependncy в контейнере.

Поскольку вы не являетесь представителем REMOTE LOCAL интерфейса, ваш EJB имеет тип без интерфейса. Это означает, что вы должны аннотировать EJB с @LocalBean

@Stateless 
@LocalBean 
@Path("wgm.rest.balanceview") 
public class BalanceViewFacadeREST 



//@Inject 
    OR 
// @EJB 
    private BalanceViewFacadeREST balanceFacade; 
+0

Спасибо! К сожалению, я действительно новичок в EJB, поэтому я не знаю, зачем нам @LocalBean, но я думаю, мне придется погрузиться глубже в эту тему. В любом случае, это разрешило вышеупомянутую проблему, но теперь я получаю серьезное сообщение журнала: «Тяжелый: класс [Lwgm/rest/service/BalanceViewFacadeREST;] не найден. Ошибка при загрузке [class wgm.servlets.BalanceServlet]» и I получите 404 для всех моих путей (также те, которые не связаны с/балансом). Может быть, это связано или это еще одна проблема? Btw, im используя версию Glassfish 4.1.1. – Severin

+0

Я больше не получаю серьезное сообщение журнала, так как я полностью очистил и перестроил приложение и удалил каталоги «сгенерированный» и «osgi-chache» в Glassfish (просто чтобы быть уверенным). Кажется, проблема связана с развертыванием NetBeans в Glassfish. Когда я вручную копирую архив войны в папку autofploy Glassfish, он отлично работает. Но я думаю, что я открою новый вопрос по этому вопросу. – Severin

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