【发布时间】: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