无法注入本地EJB。 依赖注入失败

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

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

无法解析引用Local ejb-ref name = com.sallie.logic.RSSbean / tclient,Local 3.x interface = com.eb .thriftEJBinterfaces.thriftEJBinterf * ace,ejb-link = null,lookup =,mappedName =,jndi-name =,R * efType =会话

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

  • javax.naming.NamingException:查找失败'java:comp / env / com
  • javax.naming.NamingException:Exception解析Ejb for'Remote ejb-ref
  • javax.naming.NameNotFoundException:c
  • javax.naming.NamingException:查找失败的'java:comp / env / c
  • 无论我如何进行注射,它都不起作用。 我有其他的EJB在这个项目中执行完全相同的事情,工作正常。 我的数据库访问对象使用注入,它仍然在运行。 出于某种原因,这个EJB不会注入。

    编辑:带注释的类声明:(基本上这个类创建一个到外部服务器的套接字连接,而不是在我的web应用程序中,但是在该地址使用名为thrift的IDL可用,这已经过测试,并且作为java SE程序运行(注意:服务器日志错误并不表示这是一个问题,日志文件会抛出参考和命名例外,因为它们无法找到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我可以使用无界面视图,它并没有解决问题。

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


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

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

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

    我会尝试编写一个真正简单的测试版本的EJB:

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

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

    链接地址: http://www.djcxy.com/p/58777.html

    上一篇: Cannot inject a local EJB. Dependency Injection failed

    下一篇: How should we avoid this Injection exception?