2011-12-29 111 views
0

我在EJB3.1中使用glassfish 3.1和JEE6。我只是试图用无界面视图注入一个无状态的LocalBean到另一个EJB中,以便我可以访问它的一个方法。但是我立即在注射网站上发现部署错误。无法注入本地EJB。依赖注入失败

如果我注入它的接口@EJB接口接口;

无法解析引用本地EJB-REF名= com.sallie.logic.RSSbean/tclient,本地3.X界面= com.eb .thriftEJBinterfaces.thriftEJBinterf * 王牌,EJB链接= NULL,查找=,mappedName =,JNDI名称=,R * efType =会话

如果我通过无界面视图中@EJB为myBean豆注入它;

  • javax.naming.NamingException中:查找失败 '的java:comp/env的/ COM
  • javax.naming.NamingException中的:异常解析ejb作为' 远程EJB-REF
  • javax.naming.NameNotFoundException: ç
  • javax.naming.NamingException中:查找失败“的java:comp/env的/ C

无论我怎么做这是行不通的注射。我有其他的EJB在这个项目中执行完全相同的事情,工作正常。我的数据库访问对象使用注入,它仍然在运行。出于某种原因,这个EJB不会注入。

编辑:类声明与注释:(基本上这个类创建一个套接字连接到外部服务器不在我的web应用程序,但可用在使用IDL叫做节俭该地址本进行了测试,适用于它。作为一个Java SE程序(注:服务器日志错误并不表明这是一个问题,日志文件THROW参考和命名异常,因为如果他们找不到EJB。)

package com.eb.thrift; 

import com.eb.thrift.sendEventMessage2; 
import com.eb.thriftEJBinterfaces.thriftEJBinterface; 

import org.apache.thrift.TException; 
import org.apache.thrift.protocol.TBinaryProtocol; 
import org.apache.thrift.transport.TSocket; 
import org.apache.thrift.transport.TTransportException; 

import javax.annotation.ManagedBean; 
import javax.ejb.Remote; 
import javax.ejb.Local; 
import javax.ejb.LocalBean; 
import javax.ejb.Singleton; 
import javax.ejb.Stateless; 

@Stateless 
@LocalBean 
public class ThriftClient{ 

    public ThriftClient() { } 

    public String sendToServer(String say) { 
     System.out.println("Entering ThriftClient's main method starting server connection..."); 

     String msg = null; 
     //**Make Socket** 
     TSocket socket = new TSocket("982.222.33.44", 30888); 

     //**Make Buffer** 
     //TSocket bufferedSocket = (socket); skipping this step because the jvm already handles 
     //the buffering on this end. 

     //**put in protocol** 
     TBinaryProtocol protocol = new TBinaryProtocol(socket); 
     //**create client to use protocol encoder** 
     sendEventMessage2.Client client = new sendEventMessage2.Client(protocol); 
     //**connect** 
     try { 
      socket.open(); 
     } catch (TTransportException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      client.ping(); 
     } catch (TException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      msg = client.sayMsg(say); 
      return msg; 
     } catch (TException e) { 
      msg = "response from server failed"; 
      e.printStackTrace(); 
     } 
     socket.close(); 
     return msg; 
    } 
} 

我试过。这与有和没有接口,因为我使用3.1我可以使用无接口视图,它并没有解决问题。

我想知道是否可以使用一些注释参数来显式设置映射和名称,以便可以更好地找到引用。

+0

你可以包含你尝试注入的bean的类声明(带注释)吗? – Perception 2011-12-29 21:44:02

+0

@Perception添加了类声明我不知道它会有所帮助。我一直在使用这种形式3或4其他的EJB,它工作正常。出于某种原因,它不喜欢这个EJB,我认为这是因为我想在EJB内部做什么,并且错误只是误导。因为当我注释掉EJB的主体时,Glassfish允许我毫无问题地注入它并部署它。 – Randnum 2011-12-29 21:50:30

+1

“因为当我注释掉我的EJB的身体时,Glassfish允许我毫无问题地注入它并部署它。”如果是这种情况,那么你应该张贴整个身体。 – 2011-12-29 21:53:59

回答

4

我认为你已经证明,尽管日志说什么,节俭代码的问题。如果你移除它,注射就会起作用;如果您将其放入,注射失败。这在Thrift代码中非常强烈。

我怀疑这是一个类加载问题。应用程序服务器找不到Thrift库,或找到错误的版本,因此该类无法加载或无法实例化。该失败意味着EJB无法实例化,这意味着查找失败。

您会期望导致失败记录的潜在异常,但这可能是应用程序服务器中的错误或疏忽。这种事情经常令人沮丧地发生。

我想尝试写,做了EJB的一个非常简单的测试版本:

try { 
    System.err.println(Class.forName("org.apache.thrift.transport.TSocket")); 
} 
catch (Exception e) { 
    System.err.println(e); 
} 

,看看你会得到什么方法被调用时。

+0

这是输出: 重度:抛出java.lang.ClassNotFoundException:org.apache.thrift.transport.TSocket \t在com.sun.enterprise.loader.ASURLClassLoader.findClassData(ASURLClassLoader.java:808) \t在玉米.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:696) \t在java.lang.ClassLoader.loadClass(ClassLoader.java:306) \t在java.lang.ClassLoader.loadClass(ClassLoader.java:247 ) – Randnum 2011-12-29 23:25:06

+0

接受为答案。您通过这些误导性的服务器日志看到了。谢啦。现在来找出为什么glassfish不能看到这些库文件...为另一个话题! – Randnum 2011-12-30 00:39:46

+0

真的,@ Perception的第二个评论有解决方案。我只是更详细地阐述了它。 – 2011-12-30 00:53:41