我正在使用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中的非接口视图注入它;
无论我怎么做注射它都不起作用。我有其他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我可以使用无接口视图,但它没有解决问题。
我想知道我是否可以使用一些注释参数来显式设置映射和名称,以便更好地找到引用。
答案 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);
}
看看调用该方法时得到了什么。