代码之家  ›  专栏  ›  技术社区  ›  Honza Kopecky

JavaEE-通过Glassfish资源将EJB连接到Oracle数据库

  •  0
  • Honza Kopecky  · 技术社区  · 8 年前

    我是Java和EE的新手。我启动了一个EE项目,该项目应该提供RESTAPI,它将处理远程Oracle数据库中的2个实体。我使用NetBeans是因为它是在企业Java中完成任何事情的唯一方法(正如我现在看到的)。

    我所做的:

    1. 我在Glassfish(v4.1-13)中创建了JDBC池。我可以成功地ping池。然后,我为池创建了JDBC资源。
    2. 我为需要处理的两个实体生成了实体类。

    <persistence version="2.1" xmlns...>
      <persistence-unit name="semestralka-ejbPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/dbs</jta-data-source>
        <class>cz.ctu.bitjv.kopecj24.semestralka.entities.Food</class>
        <class>cz.ctu.bitjv.kopecj24.semestralka.entities.User</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
          <property name="eclipselink.target-database" value="Oracle"/>
        </properties>
      </persistence-unit>
    </persistence>
    1. 我有一个无状态EJB,它调用实体管理器,如下所示:

    public FoodServiceBean()
    {
      this.facade = new FoodFacade(Food.class);
      this.facade.setEntityManager(Persistence.createEntityManagerFactory("semestralka-ejbPU").createEntityManager());
    }
    1. 然后,有一个REST服务类,它应该列出数据库中的实体。

      @路径(“食物”) 公共类食品资源{

      @Context
      private UriInfo context;
      
      private FoodServiceInterface service;
      
      /**
       * Creates a new instance of FoodResource
       */
      public FoodResource() {
          try {
              InitialContext ic = new InitialContext();
              service = (FoodServiceInterface) ic.lookup("java:global/semestralka/semestralka-ejb/FoodServiceBean");
          } catch (NamingException ex) {...} 
      }
      
      @GET
      @Produces(MediaType.TEXT_PLAIN)
      @Path("list")
      public String getAll() {
          List<Food> foods = service.listAllFood();
          ...
      }
      

      }

    不幸的是,一旦我请求getAll操作(访问localhost:8080/semetralka-war/wr/food/list),我就会得到以下异常:

    Warning:   StandardWrapperValve[cz.ctu.bitjv.kopecj24.semestralka.rest.ApplicationConfig]: Servlet.service() for servlet cz.ctu.bitjv.kopecj24.semestralka.rest.ApplicationConfig threw exception
    javax.naming.NameNotFoundException: dbs not found
    

    以下是异常屏幕的截图: Glassfish 500 Error screen

    3 回复  |  直到 8 年前
        1
  •  0
  •   chathura rupasinghe    8 年前

    仔细检查持久化单元和glassfish服务器中的连接池名称。你也可以用实体更新你的问题。

        2
  •  0
  •   user7361055    8 年前

    我可以看到您从rest服务调用ejb是错误的。您需要添加带有包路径的远程接口名称。

    假设您的包路径为com.rs.www,则查找字符串应如下所示:

     service = (FoodServiceInterface) ic.lookup("java:global/semestralka/semestralka-ejb/FoodServiceBean!com.rs.www.FoodServiceInterface");
    

    谢谢

        3
  •  0
  •   Honza Kopecky    8 年前

    最后,我找到了一个解决方案。问题出在我的FoodServiceBean上。我试图在EJB构造函数中实例化facade,但EntityManager是在构造函数之后注入的。下面是帮助我解决这个问题的Bean代码。

    @Stateless
    @EJB(beanInterface=FoodServiceInterface.class, name="FoodServiceBean")
    public class FoodServiceBean implements FoodServiceInterface {    
    
    @PersistenceContext(unitName="testPU")
    private EntityManager em;
    
    private FoodFacade facade;
    
    public FoodServiceBean()
    {
    
    }
    
    @PostConstruct
    public void init() {
        this.facade = new FoodFacade(Food.class);
        this.facade.setEntityManager(em);
    }
    

    请注意,我更改了持久性单元的名称,只是为了确保没有输入错误。

    谢谢你的帮助。