2016-12-29 177 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

    這不是問題所在。豆被擡起來沒有問題。 –