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

时间:2011-12-29 21:40:15

标签: java eclipse java-ee ejb ejb-3.1

我正在使用glassfish 3.1和JEE6与EJB3.1。我只是尝试将一个无状态LocalBean与no-interface视图注入另一个EJB,以便我可以访问其中一个方法。但是我立即在注射部位遇到了部署错误。

如果我注入其接口@EJB接口接口;

  

无法解析引用本地ejb-ref name = com.sallie.logic.RSSbean / tclient,Local 3.x interface = com.eb   .thriftEJBinterfaces.thriftEJBinterf * ACE,EJB链路= NULL,查找=,mappedName =,JNDI名称=,R * efType =会话

如果我通过@EJB myBean bean中的非接口视图注入它;

  • javax.naming.NamingException:'java:comp / env / com
  • 查找失败
  • javax.naming.NamingException:为远程ejb-ref
  • 解析Ejb的异常
  • javax.naming.NameNotFoundException:c
  • javax.naming.NamingException:'java:comp / env / c
  • 查找失败

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

编辑:带有注释的类声明:(基本上这个类创建了一个套接字连接到外部服务器,而不是在我的网络应用程序上,但是使用名为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我可以使用无接口视图,但它没有解决问题。

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

1 个答案:

答案 0 :(得分:4)

我认为你已经证明,尽管日志说的是,Thrift代码的问题。如果你将它取下,注射工作;如果你把它留下,注射失败。这在Thrift代码中非常强烈。

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

您可能会发现导致失败的基础异常,但这可能是应用服务器中的错误或疏忽。这种事情确实经常令人沮丧。

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

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

看看调用该方法时得到了什么。