Reputation: 11
I'm trying to connect to a session bean. I tried many different ways that I found with Google, but I always get the same error because my JNDI lookup always returns NULL.
Here's the error:
java.lang.NullPointerException
at org.apache.jsp.index_jsp._jspService(index_jsp.java:85)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
So, I'm probably missing some configuration, but I'm newbie in this stuff. A little help?
Here's my Entity Bean:
package beans;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
@Entity
public class Album {
@Id
@Column(name="idalbum")
@GeneratedValue(generator="album_idalbum_seq")
@GenericGenerator(name="album_idalbum_seq", strategy = "increment")
private int id;
@Column(name="nomealbum")
private String nome;
@ManyToMany
@JoinTable(name = "albumfaixas",
joinColumns = {
@JoinColumn(name = "idalbum")
},
inverseJoinColumns = {
@JoinColumn(name="idfaixas")
}
)
private Set<Faixas> faixas = new HashSet<Faixas>();
public Album() {}
//gets and sets
}
My Session Bean:
package DAO;
import org.hibernate.*;
import sFactory.*;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import beans.*;
@Stateless
public class AlbumDAO implements AlbumRemote {
@PersistenceContext
private EntityManager entityManager;
public List<Album> listaAlbuns() { ... code ... }
public void createAlbum(Album f) { ... code ... }
public void updateAlbum(Album f) { ... code ... }
public void deleteAlbum(Album f) { ... code ... }
}
My Remote Interface:
package DAO;
import javax.ejb.Remote;
import java.util.List;
import beans.Album;
@Remote
public interface AlbumRemote {
public List<Album> listaAlbuns();
public void createAlbum(Album f);
public void updateAlbum(Album f);
public void deleteAlbum(Album f);
}
My Local Interface:
package DAO;
import javax.ejb.Local;
import java.util.List;
import beans.Album;
@Local
public interface AlbumLocal {
public List<Album> listaAlbuns();
public void createAlbum(Album f);
public void updateAlbum(Album f);
public void deleteAlbum(Album f);
}
The reference in web.xml:
<ejb-ref>
<ejb-ref-name>ejb/AlbumRemote</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>DAO.AlbumLocal</home>
<remote>DAO.AlbumRemote</remote>
</ejb-ref>
My JSP Client code:
Context initCtx = new InitialContext();
Context ctx = (Context) initCtx.lookup("java:comp/env");
Object x = ctx.lookup("ejb/AlbumRemote");
AlbumRemote fr = (AlbumRemote)PortableRemoteObject.narrow(x, AlbumRemote.class);
fr.createAlbum(fx1);
I'm using myeclipse for developing and Tomcat for server
Upvotes: 1
Views: 2415
Reputation: 19378
You're really close. Drop in the openejb.war file and this code should work.
Tomcat doesn't natively support EJBs, but it can easily be made to do so with OpenEJB. In fact we are now calling this combo Apache TomEE and are in the process of Java EE 6 Web Profile certifying it. So it will be in the ranks of Glassfish, JBoss, Geronimo, etc.
In case you don't already have one, make sure there is a WEB-INF/classes/META-INF/persistence.xml
file in your app that defines your persistence unit.
Upvotes: 4