2011-05-27 121 views
1

我試圖連接到會話bean。我嘗試了許多與Google發現的不同方式,但我總是得到相同的錯誤,因爲我的JNDI查找始終返回NULL。訪問遠程/本地會話Bean

這裏的錯誤:

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) 

所以,我可能錯過了一些配置,但我對這個東西的新手。一點幫助?

這裏是我的實體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 
} 

我的會話Bean:

我的遠程接口:

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

我的本地接口:

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

在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> 

我的JSP的客戶端代碼:

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

我使用的MyEclipse開發和Tomcat服務器

回答

3

你真的很近。放在openejb.war file和這個代碼應該工作。

Tomcat本身不支持EJB,但可以很容易地使用OpenEJB來實現。實際上,我們現在正在調用這個組合Apache TomEE,並正在對其進行Java EE 6 Web Profile認證。因此,它將在Glassfish,JBoss,Geronimo等行列。

如果您還沒有,請確保您的應用中有一個定義您的持久性單元的文件WEB-INF/classes/META-INF/persistence.xml