2016-04-05 11 views
0

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 implementiert
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); 
    } 
} 

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?

+2

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

Antwort

0

Sie können EJBs nicht ohne einen EJB-Container (bereitgestellt von einem Anwendungsserver wie JBoss oder Websphere) ausführen. Wenn Sie ein gutes Framework für JPA benötigen, warum verwenden Sie nicht Spring (ich benutze es sowohl in Webanwendungen als auch in Java-Batches)? Es ist so einfach einzurichten und bietet alle Vorteile, die Sie von EJBs erhalten können.

+0

Ok danke, ich mache noch etwas Recherche und schaue ob ich das herausfinden kann –

0
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); 
Verwandte Themen