我正在使用 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/