Acessing Remote/Local Session Beans

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-08 08:02:13

问题


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


回答1:


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.



来源:https://stackoverflow.com/questions/6158023/acessing-remote-local-session-beans

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!