- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试编写一个简单的无状态 session bean,但我在查找时间中给出的窄引用有问题。我得到了
class cast exeption
我用
eclipse IDE
我的 bean 类
package codes;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class SinaBean implements SessionBean {
/**
*
*/
private static final long serialVersionUID = 1L;
public String getHello()
{
return "hello";
}
public void ejbCreate(){
}
@Override
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void setSessionContext(SessionContext arg0) throws EJBException,
RemoteException {
// TODO Auto-generated method stub
}
}
我的主界面
package codes;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface SinaHome extends EJBHome {
public SinaObject create() throws RemoteException,CreateException;
}
我的组件
package codes;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface SinaObject extends EJBObject {
String getHello() throws RemoteException;
}
我的客户
package codes;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Context con=null;
try {
Properties p=new Properties();
p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.setProperty(Context.PROVIDER_URL, "localhost:1099");
p.setProperty(Context.URL_PKG_PREFIXES,
"org.jboss.namingrg.jnp.interfaces");
con = new InitialContext(p);
Object o=con.lookup("SinaBean");
System.out.println(o);/***/untill know it works.it sysout :
//org.jnp.interfaces.NamingContext@e83912***
@SuppressWarnings("unused")
SinaHome sh=(SinaHome)PortableRemoteObject.narrow(o, SinaHome.class);//***exeption is here!!***
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
<display-name>Ejb </display-name>
<enterprise-beans>
<session>
<display-name>SinaBean</display-name>
<ejb-name>SinaBean</ejb-name>
<home>codes.SinaHome</home>
<remote>codes.SinaObject</remote>
<ejb-class>codes.SinaBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
</enterprise-beans>
</ejb-jar>
我收到的异常
java.lang.ClassCastException
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
at codes.Client.main(Client.java:27)
Caused by: java.lang.ClassCastException: org.jnp.interfaces.NamingContext cannot be cast to org.omg.CORBA.Object
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
... 2 more
我将非常感谢您的建议。
最佳答案
首先,您的 xml 文件表明您正在使用 EJB3(这实际上是唯一值得考虑的版本),但您的 bean 是 EJB2 bean。
如果您的服务器确实运行 EJB3,请删除 XML 文件并删除不需要的 EJB 主目录和组件实现。添加 @Stateless
注释和远程接口(interface)。确保它看起来像这样:
@Remote
public interface SinaRemote {
String getHello();
}
@Stateless
public class SinaBean implements SinaRemote {
public String getHello() {
return "hello";
}
}
然后更正您的 JNDI 属性。以下是错误的:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.namegrg.jnp.interfaces");
应该是:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
(人们在这里使用的变体几乎是无穷无尽的,而且它基本上总是有效,但只是为了确保使用正确的变体)
此外,很可能是罪魁祸首,您正在使用 ejb-name
就好像它是全局 JNDI 名称一样,但事实并非如此。 ejb-name
是一个有点令人困惑的逻辑名称,在注入(inject)或创建 ejb-ref 时引用特定 bean 时用作一种额外的限定符。
在您的情况下,您将其设置为与非限定 bean 名称相同,这已经是默认值。由于 SinaBean
存在,我猜您不是通过 EAR 进行部署,而是部署一个独立的 EJB jar,对吧?
如果您使用的是 JBoss AS 6 (EJB3.1),您可以使用 global portable JNDI names ,否则可以使用旧的 JBoss 特定 JNDI 命名:[ear name]/[simple bean name]/remote
。请注意,[简单 bean 名称] 不是 ejb 名称,但在您的情况下它们恰好相同。由于 [ear name]/
在您仅部署 EJB jar 时被删除,这解释了您遇到的异常:SinaBean
是一个目录(上下文 在 JNDI 术语中),它可以包含实际条目 local
、remote
和 no-interface
。您正在做的是尝试将此中间目录节点转换为您的 bean 的代理,这当然行不通。
无论如何,最后,删除 PortableRemoteObject
的用法,这是 no longer needed .客户端代码将如下所示:
Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
properties.setProperty(Context.PROVIDER_URL, "localhost:1099");
context = new InitialContext(properties);
SinaRemote sina = (SinaRemote) context.lookup("SinaBean/remote");
关于java - classcastexception in narrow a jndi reference in ejb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6816996/
我想在一个函数中包含一个限制语句,该函数测试在使用 org-narrow-to-subtree 之后缓冲区是否已经缩小到子树。谁能与我分享如何测试收窄条件是否有效?类似于 narrowp。 编辑:我在
static int var[2] __attribute__ ((aligned (8))) = { 0x0255cfa8, 0xfdfcddfc }; 为什么我收到警告:narro
我想做一个像mcmaster.com网站那样的侧边栏菜单。它允许您动态缩小产品范围并切换选项。正如您在图像中看到的,当选择“公制”选项时,所有页面都会根据基于公制的产品、侧边栏以及整个页面进行更改。有
我们阅读了 git narrow clones .假设我们想在极端情况下使用这个新功能最小带宽从大量远程存储库编辑一个文件并推回我们的提交。 唯一的例子是 git clone --no-checkou
我是C++的初学者,对转换有疑问。将int转换为char值时,如果在ASCII表上超过127,会发生什么? 例如, using namespace std; int main() { double d
(Postgres 8.3) 我正在使用 X 100 多列宽的数据库表(遗憾的是我无法更改),其中许多列会通过正常的业务流程不断且非常频繁地更新。 我需要根据异常业务流程更新的 X 中特定列 foo
我想对此进行过滤,以便最终返回的列表中仅包含平均数量大于 350 的部件(因此部件 P3、P4 和 P6)。我尝试使用 *SELECT """"WHERE AVG(spjandq.qty)>350 I
我正在尝试从 sourceforge 编译 hosts3d,它确实编译但生成了几个缩小错误。我不知道如何解决这个问题,但我们将不胜感激任何帮助。我怀疑我可以下载以前版本的编译器,我可能最终会这样做,但
C++ Core Guidelines有一个 narrow如果类型转换更改值,则抛出。看着 microsoft implementation图书馆: // narrow() : a checked v
问题: 我的导航栏看起来一点都不像 http://jquerymobile.com/test/docs/toolbars/footer-persist-a.html 中示例中的导航栏 我做错了什么/有
假设我有一个类型族,我在基本类型中定义了一组方法: interface Foo { Foo a(); Foo b(); ... } 并且Bar扩展了Foo interface Bar
我在我的应用程序中使用此字体时遇到问题。我已经在我的资源中导入了 Arial-Narrow.ttf 文件,并且还在 info.plist 中添加了名称,如下所示 UIAppFonts Ari
假设我有一段 HTML 的结构如下: Loooooooooooooong Short Meeeedium ...我想利用 CSS 获得
我一直在为一个学校元素编码,我遇到了这个问题,我想要一个标题而不是宽泛的标题。我是 Stack Overflow 的新手,我希望我不是在问一个非常愚蠢的问题,但我在事先搜索时没有找到答案。 我的代码是
我正在查看 Bootstrap 站点示例 http://getbootstrap.com/examples/jumbotron-narrow/#当我将鼠标悬停在“关于”或“联系”链接上时,文本周围会出
我正在尝试编写一个简单的无状态 session bean,但我在查找时间中给出的窄引用有问题。我得到了 class cast exeption 我用 eclipse IDE 我的 bean 类 pac
我尝试在启用 gcc 和 C++11 的情况下编译以下代码: unsigned int id = 100; unsigned char array[] = { id % 3, id % 5 }; 我收
#main{ margin-left: auto; margin-right: auto; margin-top: 0; font-family: "Arial Narrow"; position
g++ 4.9.0-O2 -std=c++11 template struct vec3 { T x, y, z; vec3() = default; vec3(const v
我正在使用 prettyprinter 图书馆到prettyprint foo(bar, baz) ,当边距太窄时,我希望它看起来像: foo( bar, baz) 我怎么做? 到目前为止我最
我是一名优秀的程序员,十分优秀!