EJB编写测试客户端时出现报错,这里报错的原因就是类型不匹配,我写的测试类如下:
public static void main(String[] args) throws Exception {
//获取上下文对象
InitialContext initialContext = new InitialContext();
// 获取远程服务的,并进行强制转换
TreeDelegateBean bean = (TreeDelegateBean) initialContext.lookup("TreeDelegateBean/remote");
//调用远程方法
Map<String, String> map = bean.findNodeMap();
System.out.println("map>>>" + map);
}
JNDI.properties配置文件内容:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming
java.naming.provider.url=localhost:1099
运行时就出现报错:
第一种报错:javax.naming.NameNotFoundException: TreeDelegateBean not bound
第二种报错:java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to com.ejb.service.TreeDelegateBean
解决方法:
出现第一种报错,首先检查ejb 是否启动成功。再就是 initialContext.lookup的 ejbName是否正确。在EJB 的启动日志里面有打印出各个 EJB,如下:
11:07:15,968 INFO [SessionSpecContainer] Starting jboss.j2ee:ear=ExportServer.ear,jar=es-ejb.jar,name=TreeDelegateBean,service=EJB3
11:07:15,968 INFO [EJBContainer] STARTED EJB: com.ejb.service.TreeDelegateBean ejbName: TreeDelegateBean
11:07:15,983 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
ExportServer/TreeDelegateBean/remote - EJB3.x Default Remote Business Interface
ExportServer/TreeDelegateBean/remote-com.delegate.facade.NavigationTreeDelegate - EJB3.x Remote Business Interface
所以ejbName 应该改写为 ExportServer/TreeDelegateBean/remote
第二种报错是类型转换问题,查看 TreeDelegateBean 实体类,如下:
@Stateless
@Remote(TreeDelegate.class)
public class TreeDelegateBean implements TreeDelegate{
@EJB(beanName="TreeDAOBean")
private TreeDAO treeDAO;
....(methods)
}
注意@Remote 中的值,这里是 TreeDelegate,所以转换的目标对象也是TreeDelegate。
上面两个报错修改后结果为:
TreeDelegate bean = (TreeDelegate) initialContext.lookup("ExportServer/TreeDelegateBean/remote");