【问题标题】:How do I set the JNDI properties for a local EJB bean如何为本地 EJB bean 设置 JNDI 属性
【发布时间】:2016-04-05 18:43:16
【问题描述】:

我正在尝试使用 Maven、JPA 和 EJB 学习一点 Java EE。我现在正在尝试通过使用 InitialContext 来进行基本的 EJB 查找,只是为了稍微熟悉一下 ejb 和其他东西。我对此非常陌生,我什至无法完成网上可用的教程,因为注释对我来说很有意义。我现在花了大约 4 个小时阅读 EJB、JNDI 和 InitialContext,但注意到我阅读的内容告诉了我需要了解的内容。

我正在尝试查找从 JPA 实体执行基本读取操作的本地 ejb。我已经尝试过“java:comp/env/beanName”JNDI 名称,但它仍然不起作用。我尝试了在this 帖子上找到的解决方案,但它也不起作用。这就是我所做的。

我有一个简单的ejb接口

package ejb;

import javax.ejb.Local;
import entity.Person;

@Local
public interface PersonService {
    public Person getPersonByID(int id);
}

由 ejb 实现

package ejb;

import javax.ejb.Stateless;
import javax.persistence.*;
import entity.*;

@Stateless(mappedName="PersonServiceBean")
public class PersonServiceBean implements PersonService {
    //Pass persistence unit to entity manager
    @PersistenceContext(unitName = "reporting")
    private EntityManager entityManager;

    public Person getPersonByID(int id) {
        return entityManager.find(Person.class, id);
    }
}

上面的ejb从这个实体中读取

package entity;

import java.io.Serializable;
import javax.persistence.*;


/**
* The persistent class for the person database table.
* 
*/
@Entity
@NamedQuery(name="Person.findAll", query="SELECT p FROM Person p")
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private int personID;

    private String emails;

    private String firstNames;

    private int organizationID;

    private int researchCategoryID;

    private int researchGroupID;

    private String surname;

    public Person() {
    }

    public int getPersonID() {
        return this.personID;
    }

    public void setPersonID(int personID) {
        this.personID = personID;
    }

    public String getEmails() {
        return this.emails;
    }

    public void setEmails(String emails) {
        this.emails = emails;
    }

    public String getFirstNames() {
        return this.firstNames;
    }

    public void setFirstNames(String firstNames) {
        this.firstNames = firstNames;
    }

    public int getOrganizationID() {
        return this.organizationID;
    }

    public void setOrganizationID(int organizationID) {
        this.organizationID = organizationID;
    }

    public int getResearchCategoryID() {
        return this.researchCategoryID;
    }

    public void setResearchCategoryID(int researchCategoryID) {
        this.researchCategoryID = researchCategoryID;
    }

    public int getResearchGroupID() {
        return this.researchGroupID;
    }

    public void setResearchGroupID(int researchGroupID) {
        this.researchGroupID = researchGroupID;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

}

JPA etity 连接到一个 mysql 数据库,这是 persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="reporting" transaction-type="RESOURCE_LOCAL">
        <class>entity.Person</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/people"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

我有一个作为客户端的 Main 类

import javax.naming.InitialContext;
import javax.naming.NamingException;
import ejb.*;

public class Main {
    public static void main(String[] args) throws NamingException {
        InitialContext ic = new InitialContext();
        PersonService service = (PersonService)ic.lookup("PersonServiceBean");
        entity.Person p = service.getPersonByID(1);
        System.out.println(p.getFirstNames());
    }
}

我正在使用 EclipseLink 并且我不确定我正在使用哪个应用程序服务器,如果我正在使用的话。如果它也有帮助,我正在使用 Eclipse。如果我尝试运行应用程序,我会得到 javax.naming.NoInitialContextException 异常

Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial at javax.naming.spi.NamingManager.getInitialContext(Unknown Source) at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.lookup(Unknown Source) at Main.main(Main.java:18)

那么我还能如何从 Main 访问 EJB?

【问题讨论】:

  • 我猜你弄错了一些基本概念。 main() 方法执行 Java SE 应用程序,而不是 Java EE 应用程序。您是否尝试在 Java SE 应用程序中使用 JPA/EJB? JPA 是可能的,但 EJB 只能在 Java EE 容器中运行,而 Java SE 应用程序只能访问远程 EJB。

标签: jpa jakarta-ee ejb jndi


【解决方案1】:

如果没有 EJB 容器(由 JBoss 或 Websphere 等应用服务器提供),您将无法运行 EJB。如果您需要一个好的框架来搭配 JPA,为什么不使用 Spring(我在 Web 应用程序和 Java 批处理中都使用它)?它易于设置并提供您可以从 EJB 获得的所有优势。

【讨论】:

  • 好吧thanx,我做更多的研究,看看我能不能解决这个问题
【解决方案2】:
JavaBeans that are running within the container pass their credentials within the InitialContext, which is created to look up the remote EJBs. 

To pass JNDI properties within the Hashtable environment, set them as shown below: 
Hashtable env = new Hashtable(); 
env.put("java.naming.provider.url", "ormi://localhost/ejbexample"); 
env.put("java.naming.factory.initial", 
      "com.evermind.server.ApplicationClientInitialContextFactory"); 
env.put(Context.SECURITY_PRINCIPAL, "guest"); 
env.put(Context.SECURITY_CREDENTIALS, "welcome"); 
Context ic = new InitialContext (env); 
Object homeObject = ic.lookup("java:comp/env/employeeBean");

EmployeeHome empHome =
     (EmployeeHome) PortableRemoteObject.narrow(homeObject,
                                                   EmployeeHome.class);

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2011-11-06
    • 2011-06-03
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多