Kein Zugriff auf Persistence Unit

Status
Nicht offen für weitere Antworten.

Sisyphus

Mitglied
Hi,

ich bin gerade dabei mich in JEE 5 einzuarbeiten, und bin dabei auf ein kleines Problem gestoßen.
Ich habe ein EJB Packet, in dem die Persitence Entities, die Beschreibung zur Persistence Unit und
eine Stateful Session Bean liegen. In der Bean versuche ich mit dem EntityManager auf Daten zuzugreifen.

Ausserdem habe ich noch eine Web Applikation in der eine JSP liegt. Der Web App hab ich das JAR-File der
EJB gegeben und in der JSP versuche ich auf die Bean zuzugreifen. Das Problem ist jetzt, dass in der Bean
der EntityManager nicht gesetzt werden kann.

Die PersistenceUnit:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="TestPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
    <jta-data-source>Test_DataSource</jta-data-source>
    <properties>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

Die EJB:
Code:
@Stateful
public class UserAgentBean implements UserAgentRemote, UserAgentLocal {

    @PersistenceContext(unitName="TestPU")
    private EntityManager em;
    private Student student;
    
    public UserAgentBean() {
    }

   public Student setStudent(int id) {
      student = em.find(Student.class, id);
   }
}

Die JSP Seite:
Code:
<html>
    <head>
        <title>JSP Page</title>
    </head>
    <body>
    
    <jsp:useBean id="userAgent" scope="session" class="ejb.UserAgentBean"/>
    <%
        userAgent.setStudent(123);
    %>
    
    </body>
</html>

Beim ausführen der JSP Seite bekomme ich folgenden StackTrace:
Code:
java.lang.NullPointerException
	ejb.UserAgentBean.setStudent(UserAgentBean.java:46)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:80)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:353)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:409)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:317)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
	com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
	org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:231)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)
	com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)
	com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)
	com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
	com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)

Beim Debuggen ist zu erkennen, dass der EntityManager null ist.
Das eigenartige ist, dass wenn ich in der WebApplikation ein Servlet anlege, kann ich Problemlos mit der Bean und dem EM arbeiten.

Das Servlet:
Code:
public class UserAgentTestServlet extends HttpServlet {
    
    @EJB UserAgentRemote userAgent;
    
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("</head>");
        out.println("<body>");
        
        userAgent.setStudent(1);

        out.println("</body>");
        out.println("</html>");

        out.close();
    }
    ...

Da ich noch nicht lange mit dem JEE 5 arbeite, bin ich etwas ratlos. Ich hab schon alle möglichen Kombinationen in der JSP ausprobiert.
Hab auch versucht die Persitence Klassen in eine eigene JAR zu packen, und so weiter. Leider bin ich jetzt ziemlich am Ende meines Lateins :bahnhof:

Hat hier vielleicht jemand einen Tipp?

Danke,
Sisyphus

P.S.:
Achja, ich verwende den Sun Application Server 9, falls das relevant ist ???:L
 
S

SlaterB

Gast
die Frameworks bei denen man nie weiß was sie tun..,

im Servlet setzt du das Bean mit
@EJB UserAgentRemote userAgent;

wird irgendwo noch new Bean() aufgerufen oder geschieht auch das automatisch?

der JSP-Code sieht ja eher danach aus, als wenn da new Bean() ganz ohne irgendwelche Automatismen durchgeführt wird

schreibe evtl. eine im Servlet korrekt erzeugte Bean in den SessionScope?
 

Sisyphus

Mitglied
SlaterB hat gesagt.:
die Frameworks bei denen man nie weiß was sie tun..,
Ich dachte, das ist so beabsichtigt? Zumidest wird es von Sun als Feature dargestellt :roll:
Ich wollte mich erstmal mit der Basis beschäftigen (und die verstehen) bevor ich irgendein
aufgesetztes Framework anfange.

Ich rufe nirgendwo explizit new Bean() auf, ich nehme an, dass durch die @EJB Annotation
über JNDI die Entsprechende Bean gesucht wird und der Container legt mir dann eine an.

Deshalb bin ich auch davon ausgeganben, dass der JSP Code
Code:
<jsp:useBean ...
genauso funktioniert.

SlaterB hat gesagt.:
schreibe evtl. eine im Servlet korrekt erzeugte Bean in den SessionScope?
Danke für den Tipp, da habe ich jetzt einen Ansatzpunkt, von dem aus ich mal weiterprobieren kann :)
Ich melde mich wieder, wenn ich das Problem so lösen konnte (oder wieder stecken bleibe).
 

Sisyphus

Mitglied
Nochmal vielen Dank an SlaterB! :applaus: :applaus: :applaus:

Ich habe das ganze jetzt so gelöst:

In der JSP Seite:
Code:
<jsp:include page="SetUserAgent" />
<jsp:useBean id="userAgent" scope="session" type="UserAgentRemote"/>
<%
        userAgent.setStudent(123);
%>

Und das Servlet dazu sieht folgendermaßen aus:
Code:
public class SetUserAgent extends HttpServlet {
    @EJB UserAgentRemote userAgent;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        if(request.getSession().getAttribute("userAgent") == null) {
            request.getSession().setAttribute("userAgent", userAgent);
        }
    }
}

Kann mir jetzt noch jemand sagen, ob die Stateful EJB die ich über die Annotation im Servlet bekomme
für die Session eindeutig ist. Also wenn mehrere User die JSP Seite aufrufen, bekommt dann jeder eine
eigene Bean in die Session?

Edit:
Achja, und kann mir jemand ein gutes Buch zu JavaServer Faces empfehlen (bevorzugt auf deutsch, muss aber nicht sein)
 
S

SlaterB

Gast
ich glaube eher, dass es von den Servlet-Objeken nicht viele gibt,
und diese für beliebige Sessions benutzt werden,
daher dürften allle Sessions das gleiche Bean haben oder zumindest jeweils eins aus einer kleinen Menge,

aber ob das was ich irgendwann mal über Servlets gelernt habe noch stimmt?
zum Glück ist es recht einfach sowas nachzuprüfen,

überschreibe einfach den Konstruktor des Beans und lasse dir ausgeben,
wann ein Bean erzeugt wird,
logge jeden Request, jede Session
(ganz primitiv: schaue ob ein Feld 'nummer' gesetzt ist, ansonsten vergebe eine eindeutige Nummer),
dann ein paar Sessions erzeugen, dürfte jeweils eine neue geben wenn InternetExplorer geschlossen und neu geöffnet wird,
usw.,
alles ausprobieren, nicht nur fragen und nachlesen ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P [Maven2] maven-jaxb2-plugin - Kein absoluter Pfad für "<schemaDirectory> möglich??? Allgemeines EE 2
D Kein EntityManager in Eclipse (!) Allgemeines EE 2
T [EJB QL] Warum bekomme ich kein Result? Allgemeines EE 3
B Kein definiertes Bean? --- JDeveloper Allgemeines EE 5
pkm Frage wegen AJAX-Zugriff auf ein Servlet Allgemeines EE 1
G War zugriff auf Ejb in EAR Allgemeines EE 0
S MessageDrivenBean Problem beim Zugriff auf Stateful EJB Allgemeines EE 2
R RMI Zugriff zwischen zwei WAR Projekten Allgemeines EE 1
G Nativer bzw. direkter Zugriff auf Active Directory Allgemeines EE 4
B Cookie beim erstem Zugriff auf Web-App ablegen Allgemeines EE 3
T JMX und ServiceMBean - Zugriff mittels Client Allgemeines EE 2
W JSP Zugriff auf RemoteInterfaces Allgemeines EE 2
S Pfad-Zugriff über Servlet-init() Allgemeines EE 2
Y Zugriff auf Files aus einer EAR Anwendung Allgemeines EE 8
F problem mit nullpointer bei DB zugriff Allgemeines EE 2
G Direkter Zugriff auf Servlet- doPost Allgemeines EE 15
J JSF: Zugriff auf message bundle Allgemeines EE 1
C Tomcat Zugriff auf lokale Dateien Allgemeines EE 2
J geschützter Bean zugriff mit einem Rich-Client Allgemeines EE 2
T Zugriff auf EJB Allgemeines EE 3
L Zugriff auf Manager nur von localhost Allgemeines EE 11
S 1. ContrBean + Image zurück, 2. DB-Zugriff per utilityklasse Allgemeines EE 5
N Zugriff auf Webapp nur für localhost definieren (Tomcat) Allgemeines EE 2
T Zugriff auf persistentes Set in einem Objekt Allgemeines EE 2
R Zugriff auf Dateien in Meta/Web-Inf Verzeichnis Allgemeines EE 7
R Zugriff auf Filter Servlet Allgemeines EE 10
R Zugriff auf Managed Bean aus einem Filter Allgemeines EE 2
N zugriff auf sämtliche navigation rules Allgemeines EE 6
A Zugriff auf Parameter im Deployment Descriptor Allgemeines EE 2
T Zugriff auf Session-Objekte in JSP Allgemeines EE 2
H Velocity: Zugriff auf Sessionvariable? Allgemeines EE 3
S Keystore Zugriff aus Web-Anwendung Allgemeines EE 2
S Alternative zu Properties/ Zugriff außerhalb der Locale Allgemeines EE 7
J In einem Bean zugriff auf ein SessionBean? Allgemeines EE 2
K Zugriff auf Dateien beschränken Allgemeines EE 2
K dynamischer Zugriff auf .properties (Struts) Allgemeines EE 2
R Servlet/JSP zugriff auf Thumbnails ausserhalb Webroot Allgemeines EE 3
G Parameterübergabe u. -zugriff bei jsp:include Allgemeines EE 3
K [Tomcat 5.5.12+Axis] Datenbank Zugriff Allgemeines EE 2
K JSF - Zugriff auf Managed Beans Allgemeines EE 2
H JSP Zugriff auf JavaBean Allgemeines EE 4
S zugriff von jsp-seiten auf java klassen Allgemeines EE 3
L Wie bekomme ich denn einen Zugriff auf die EJB ??? Allgemeines EE 7
C [JSP] errorpage: Zugriff auf exception-Objekt Allgemeines EE 2
M java.lang.SecurityException: class "javax.persistence.TupleElement"'s signer information does not match ... Allgemeines EE 1
K No Persistence provider for EntityManager named X Allgemeines EE 14
C Persistence Provider wechseln [Netbeans] Allgemeines EE 1
J @Valid ergibt AbstractMethodError at javax.persistence Allgemeines EE 5
E persistence.xml Allgemeines EE 18
G EJB und Java EE - No Persistence provider Allgemeines EE 5
R [JPA] Platzhalter in persistence.xml Allgemeines EE 6
M The re is no default persistence unit in this deployment Allgemeines EE 2
S JSP und Java Persistence API Allgemeines EE 2
H Die JBossMQ im JBoss auf File-Persistence stellen? Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben