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

时间:2016-12-29 19:51:49

标签: java oracle jpa glassfish ejb

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

我做了什么:

  1. 我在Glassfish中创建了JDBC池(v4.1-13)。我可以成功ping通池。然后我为池创建了JDBC资源。
  2. 我为我需要处理的两个实体生成了实体类。
  3. 
    
    <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>
    &#13;
    &#13;
    &#13;

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

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

        @Path(&#34;食品&#34) 公共课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();
            ...
        }
        

        }

      2. 不幸的是,一旦我请求getAll操作(访问localhost:8080 / semestralka-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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

假设您的包路径是com.rs.www,那么您的查找字符串应该是以下一个:

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

感谢。

答案 2 :(得分:0)

最后,我找到了一个解决方案。问题发生在我的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);
}

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

感谢您的帮助。