java - 无法注入(inject)本地 EJB。依赖注入(inject)失败

标签 java eclipse jakarta-ee ejb ejb-3.1

我正在使用 glassfish 3.1 和 JEE6 以及 EJB3.1。我只是尝试将一个具有无接口(interface) View 的无状态 LocalBean 注入(inject)到另一个 EJB 中,以便我可以访问它的方法之一。但我立即在注入(inject)站点上收到部署错误。

如果我注入(inject)它的接口(interface)@EJB Interface接口(interface);

Cannot resolve reference 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=Session

如果我通过无接口(interface) View 注入(inject)它,如@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”失败

无论我如何进行注入(inject),它都不起作用。我让其他 EJB 在此项目中执行完全相同的操作,并且运行良好。我的数据库访问对象使用注入(inject)并且它仍在运行。由于某种原因,此 EJB 将不会注入(inject)。

编辑:带注释的类声明:(基本上,此类创建一个到外部服务器的套接字连接,该外部服务器不在我的 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,我可以使用无界面 View ,但它没有解决问题。

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

最佳答案

我认为您已经证明,无论日志怎么说,Thrift 代码都是问题所在。如果你把它去掉,注入(inject)就起作用了;如果你把它留在里面,注入(inject)就会失败。这非常有力地指向了 Thrift 代码。

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

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

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

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

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

关于java - 无法注入(inject)本地 EJB。依赖注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8673793/

相关文章:

java - 使用 Java future 进行无限操作是错误的吗?

Java:HTTP异步非阻塞远程日志服务器?

eclipse - Maven - 为什么在 "mvn clean"之后我需要在 "Maven Update Project"之前执行 "mvn package"?

javascript - 减少 Phonegap 项目大小 (Android)

android - 能否在人脸检测器中使用欧拉角形成一个完美的圆形包围人脸

security - @RunAs 和角色传播

java - Libgdx声音效果仅在Android上无法流畅或完全播放(声音上的滞后效果)

java - 哪些对象将传递给 Mockito 中的自定义 ArgumentMatcher

java - 如何对 Liquibase 数据源配置和 persistence.xml 应用 DRY?

java - 如何使我的 Java/Java EE 应用程序的 IP 更安全?