JPA kein EntityManager

dadom110

Erfahrenes Mitglied
Tag Zusammen,

versuche gerade ein kleine WebProject auf zu setzen mit einer Datenbank dahinter. Leider bekomme ich das mit der Persistenz schicht einfach nicht auf die Reihe.

Software:
Eclipse Europe
Derby Datenbank
GlassFish Application Server

Ich bin wie folgt vorgegangen:

1. bei Ecipse ein "dynamic WebProject" ausgwählt.
2. als Persistenz Unit musste ich ihm ne neue libray basteln (?) hab ihm da das toplink-essentials und toplink-essentials-agent aus meinem SUN Ordner mitgegeben
3. Java Klasse erstellt die persistiert werden soll.
4. Datenbank und Tabelle in Derby angelegt
5. die Persistenz Unit in der persistence.xml eingetragen:

Code:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="default">
        <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
        <class>dd.ReminderDate</class>
        <properties>
            <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
            <property name="toplink.jdbc.url" value="jdbc:derby:C:\DerbyDatabases\dreminder;create=true"/>
            <property name="toplink.jdbc.user" value="admin"/>
            <property name="toplink.jdbc.password" value="adminadmin"/>
            <property name="toplink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

6. mein BeispielCode (Servlet) versucht nun einen EntityManager zu bekommen:

Code:
public class EntityManagerServlet extends HttpServlet {
	@PersistenceContext
	private static EntityManager em;
	
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		if (arg0.getSession().getAttribute("em")==null) {
			EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("default");
			em = emFactory.createEntityManager();
			arg0.getSession().setAttribute("em", em);
		}
	}
}

7. eine "nette" Exception auf der Serverseite

Code:
Message ID: ApplicationDispatcher[/DReminders] Servlet.service() for servlet EM threw exception java.lang.NullPointerException at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java 
Complete Message 
120)	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)	at dd.entities.EntityManagerServlet.service(EntityManagerServlet.java:21)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)	at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:397)	at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:850)	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:697)	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:654)	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:568)	at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:983)	at org.apache.jsp.index2_jsp._jspService(index2_jsp.java:75)	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:353)	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:412)	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:318)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)	at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:397)	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:278)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:240)	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:179)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:182)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:137)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:239)	at com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)	at com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)	at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)	at com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)	at com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)	at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)	at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75

Bin schon am verzweifeln, hoffe jemand hat eine IDee, was ich vergessen / falsch gemacht habe...

Viele dank schon mal
D
 
Du brauchst den EntityManager nicht selbst erzeugen, de injiziert dir der Container. Desweiteren solltest du in Servlets nicht @PersistenceContext mit nem EntityManager benutzen, sondern eine private EntityManagerFactory halten, die mit @PersistenceUnit annotiert ist. EntityManager ist nämlich laut Spec nicht Threadsafe ^^. Grauenvoll, ist aber leider so.

So sollte es dann eigentlich tun:

Java:
public class EntityManagerServlet extends HttpServlet {
	
        @PersistenceUnit
	private EntityManagerFactory factory;
	
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		
              EntityManager em = factory.createEntityManager();
              // do something useful here
	}
}

REINHAUN!
 
Guten Tag,

leider hat das bisher auch noch kein Erfolg gehabt.

Hab das ganze jetzt mal auf ein JSP zusammen geschrumpft:

Code:
<%!
  	@PersistenceUnit
    private EntityManagerFactory factory;
 	EntityManager em = factory.createEntityManager();
 %>

persistence.xml sieht immer noch so aus:
Code:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="default">
        <provider>oracle.toplink.essentials.PersistenceProvider</provider>
        <class>dd.dreminder</class>
        <properties>                                      
            <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
            <property name="toplink.jdbc.url" value="jdbc:derby:C:\DerbyDatabases\dreminder2;create=true"/>
            <property name="toplink.jdbc.user" value="admin"/>
            <property name="toplink.jdbc.password" value="adminadmin"/>
            <property name="toplink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

Leider immer noch Fehlermeldung :( langsam bin ich doch ein wenig verzweifelt:

Code:
Message ID: StandardWrapperValve[jsp] 
Complete Message 
Servlet.service() for servlet jsp threw exceptionjava.lang.NullPointerException	at org.apache.jsp.index2_jsp.<init>(index2_jsp.java:20)	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)	at java.lang.Class.newInstance0(Class.java:355)	at java.lang.Class.newInstance(Class.java:308)	at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:149)	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:336)	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:412)	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:318)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)	at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:397)	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:278)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:240)	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:179)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:182)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:137)	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:239)	at com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)	at com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)	at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)	at com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)	at com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)	at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)	at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)

Hoffe noch mal auf Hilfe

Dom
 
und wieder was gelernt, allerdings hatte ich das auch nur schnell direkt in die JSP geschrieben weil das andere ebenfalls nicht geklappt hat :(

JSP:
Code:
<body>

<jsp:include page="/servlet/em"></jsp:include>

</body>

Servlet:

Code:
public class EntityManagerServlet extends HttpServlet {
    
        @PersistenceUnit
    private EntityManagerFactory factory;
    
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        
              EntityManager em = factory.createEntityManager();
              arg0.getSession().setAttribute("em", em);
              arg1.getWriter().write("Manager erhalten");
    }
}
Fehler
Code:
Message ID: ApplicationDispatcher[/DReminder] Servlet.service() for servlet EM threw exception java.lang.NullPointerException at dd.entities.EntityManagerServlet.service(EntityManagerServlet.java 
Complete Message 
21)	
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)	
at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:397)
 ... ...

und direkt dahiner im Log noch eine Fehlermeldung:
Code:
Message ID: StandardWrapperValve[jsp] 
Complete Message 
Servlet.service() for servlet jsp threw exceptionjava.lang.NullPointerException	
at dd.entities.EntityManagerServlet.service(EntityManagerServlet.java:21)
 ...
 ......

*kreisch* so langsam weiss ich nicht mehr weiter...

Grüße
D
 
Ein include wird nicht helfen... du musst das Ding per GET Request anspringen. Der Weg ist im ALlgemeinen auch Servlet -> JSP und nicht umgekehrt. Hast du das Servlet in der web.xml delariert?

Nochwas, was soll der EntityManager in der Session? Ganz großes NoGo!! Lies die Daten die du brauchst im Servlet und leg sie in den Request. Die JSP sollte dann nur auf Daten aus dem Request zugreifen.

REINHAUN!
 
Zuletzt bearbeitet:
HuHu..

mach die ganze Web-Geschichte noch nicht so lange, darum bin ich dir sehr dankbar über deine "NoGo-Kommentare". Servlet ist eingetragen. Erreiche das Servlet ja auch über den Weg. Aber mal eine dumme Frage wie rufe ich ein Servlet denn mit Get-Request auf? Und Was ist wenn ich einfach die URL des Servlets angeben .../servlet/dreminder) ist das dann ein Post?

Lies die Daten die du brauchst im Servlet und leg sie in den Request. Die JSP sollte dann nur auf Daten aus dem Request zugreifen.
REINHAUN!

Müssen die Daten dann nicht in die Response?
Grüße
Dom
 
Zuletzt bearbeitet:
Ein normaler URL Aufruf (über den Browser z.B.) ist ein GET, jeder Link klick auch. HTML Formulare werden standardmäßig per POST übertragen.

@Response - nein. In den Response kommt alles, was zum Client zurück soll. In deinem Servlet bereitest du ja nur Daten auf, die du dann im JSP darstellen willst. D.h. als Daumenregel gilt: Daten im Servlet aus dem Backend auslesen, und in den Request stecken. Im JSP dann auf die Daten im Request zugreifen.

REINHAUN!

PS: Tut der EntityManager denn jetzt?
 
EntityManager will immer noch nicht. Hatte die befürchtung das mein Application Server ohne hin nicht mehr ganz ok ist. Darum hab ich alle noch mal Neuinstalliert (java_ee_sdk-5_04-windows.exe) + Eclipse Europa. Jetzt habe ich allerdings das Problem das ich KEINEN Server Adapter mehr für GlassFish oder Sun Application Server in meiner Liste habe. Beim additional Download bekomm ich auch nur andere. :( kann man die per "Hand" irgendwo runter laden ?(Server: Sun Java System Application Server 9.1_01 )

>> hab ihn, Proxy war bei der SSL Verbindung nicht eingetragen *grml*

grüße
D
 
Zuletzt bearbeitet:
HuHu..

ok also jetzt läuft wieder alles -->> bis auf der EntityManager :)

Gelöst: Hab in einem meiner schlauen Bücher was gefunden:

Code:
factory=Persistence.createEntityManagerFactory("default");

Das Komische ist auch der Verzeichnisaufbau den Eclipse mir liefert sobald ich die Persistenz Unit einstelle.

Normalerweise hab ich ja:
src
build
WebContent (und darin die Meta-INF mit der persistence.xml)

Eclipse erstellt dann aber einen "Meta-INF" Ordner im src Ordner. Hat mich ein wenig gewunder. Halte zur Zeit die persistence.xml jetzt doppelt weil ich mir nicht sicher bin welcher er benutzt..

Hab natürlich gleich noch einen Fehler :) Wie adde ich der session einen Descriptor? Dachte durch meine Annotations in der EntityBean und den Eintrag in der Persistence.xml würde er wissen was zu tuen ist?

Exception [TOPLINK-6007] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.QueryException
Exception Description: Missing descriptor for [class dd.entities.DReminder].
Query: ReadAllQuery(dd.entities.DReminder)
grüße
D
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück