Ich versuche, ein wenig Java EE mit Maven, JPA und EJB zu lernen. Ich versuche jetzt, eine grundlegende EJB-Suche zu machen, indem ich InitialContext benutze, nur um ein wenig mit ejb's und sowas vertraut zu machen. Ich bin extrem neu und ich kann nicht einmal die im Netz verfügbaren Tutorials machen, weil das für mich einen Sinn ergibt. Ich habe ungefähr 4 Stunden damit verbracht, auf EJB, JNDI und InitialContext zu lesen, aber ich merke, dass ich lese, sagt mir, was ich wissen muss.Wie setze ich die JNDI-Eigenschaften für eine lokale EJB-Bean
Ich versuche, einen lokalen ejb zu suchen, der eine grundlegende Leseoperation von einer JPA-Entität ausführt. Ich habe den JNDI-Namen "java: comp/env/beanName" versucht, aber es funktioniert immer noch nicht. Ich habe versucht, die Lösung auf this Post gefunden, aber es funktioniert auch nicht. Das habe ich getan.
Ich habe eine einfache ejb Schnittstelle
package ejb;
import javax.ejb.Local;
import entity.Person;
@Local
public interface PersonService {
public Person getPersonByID(int id);
}
die
von einem ejb implementiertpackage 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);
}
}
und die oben ejb aus dieser Einheit liest
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;
}
}
Die PPV etity verbunden ist zu einer MySQL-Datenbank und das ist die 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>
Ich habe eine Hauptklasse, die als Client fungiert
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());
}
}
Ich bin mit Eclipse amd Ich bin nicht sicher, welche Anwendungsserver verwende ich, wenn ich überhaupt ein verwenden. Ich benutze Eclipse, wenn es auch hilft. Wenn ich versuche, die Anwendung auszuführen erhalte ich javax.naming.NoInitialContextException Ausnahme
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)
Wie sonst dann kann ich accessthe EJB aus Main?
Ich denke, Sie haben einige grundlegende Konzepte falsch. Die Methode 'main()' führt eine Java SE-Anwendung und keine Java EE-Anwendung aus. Versuchen Sie, JPA/EJB in einer Java SE-Anwendung zu verwenden? JPA ist möglich, aber EJB kann nur in einem Java EE-Container ausgeführt werden, und eine Java SE-Anwendung kann nur auf Remote-EJBs zugreifen. – BalusC