2016-12-29 114 views
0

我特别是Java和EE的新手。我开始了一个应该提供REST API的EE项目,它将处理远程Oracle数据库中的两个实体。我使用的是NetBeans,因为它是如何在Enterprise Java中完成任何事情的唯一方法(就像我现在看到的那样)。Java EE - 通过Glassfish资源将EJB连接到Oracle数据库

我所做的:

  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>

  • 我有一个无状态EJB它调用这样的实体管理器:
  • public FoodServiceBean() 
     
    { 
     
        this.facade = new FoodFacade(Food.class); 
     
        this.facade.setEntityManager(Persistence.createEntityManagerFactory("semestralka-ejbPU").createEntityManager()); 
     
    }

    1. 然后,有一个REST服务类应该列出数据库中的实体。

      @Path( “食物”) 公共类FoodResource {

      @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操作(访问本地主机:8080/semestralka战/ 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 
    

    这里是一个例外的屏幕截图s creen: Glassfish 500 Error screen

    +0

    “无法获取数据源”。所以你的JNDI数据源没有找到。所以调试它 –

    回答

    0

    最后,我找到了一个解决方案。问题出在我的FoodServiceBean中。我试图在EJB构造函数中实例化外观,但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); 
    } 
    

    请注意,我更改了持久性单元的名称,以确保没有错别字。

    感谢您的帮助。

    0

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

    +0

    池名称是正确的。 –

    0

    我可以看到你从休息服务调用的ejb是错误的。您需要使用软件包路径添加远程接口名称。

    比方说你的包路径com.rs.www那么你的查询字符串应该被以下之一:

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

    感谢。

    +0

    这不是问题所在。豆被抬起来没有问题。 –