如何将无状态会话bean注入servlet?

时间:2016-07-23 21:55:05

标签: java jpa servlets

我的高级目标是使用NetBeans生成的JPA代码,使用来自数据库的创建" RESTful Web服务"我的servlet中的向导。

更准确地说,我想直接从servlet访问外观,以避免在客户端使用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。我错过了什么?

1 个答案:

答案 0 :(得分:2)

我认为你的Servlet和你的EJB是彼此本地的。我的假设是你的EJB没有远程接口。

如果Servlet和EJB驻留在同一个容器中,只需在容器中注入Context和Dependncy,就可以使用@EJB或@Inject进行分配。

由于您既没有提供REMOTE,也没有提供LOCAL接口,因此您的EJB是No-Interface类型。这意味着您应该使用 @LocalBean

对EJB进行注释
@Stateless
@LocalBean
@Path("wgm.rest.balanceview")
public class BalanceViewFacadeREST



 //@Inject
    OR
 // @EJB
  private BalanceViewFacadeREST balanceFacade;
相关问题