当前位置: 首页 > 知识库问答 >
问题:

如何在Liberty中正确获取和强制转换JNDI对象

阴福
2023-03-14

服务器将MyEJB企业bean的xxx.interfaces.MyLocal接口绑定在xxx-ear应用程序的xxx-ejb.jar模块中。绑定位置为:java:global/xxx/myejb!xxx.interfaces.mylocal

然后我有了一个web应用程序(ear),它为先前启动的ejb-service提供了一个服务提供者(带有@produces),它将为应用程序的其余部分提供可注入的JNDI资源(@inject)(有点棘手,主要思想是允许从配置文件中更改查找位置+还做一些其他事情)。它似乎可以正确地工作,但是当获得jndi资源时,它可以工作,但不是正确的。

如果我将ejb部分作为依赖项放入Web模块中,我可以直接将其注入(@inject MyLocal myejb;)。

注入的资源是正确的(当然是自动的)在'MyLocal'接口上强制转换的,并且是OK的。当我试图检查使用JNDI获得的资源时,它既不符合'MyLocal'的实例,也不符合'MyRemote'的实例?当然,对于ClassCastException,实际的强制转换也会失败。(MyRemote与MyLocal接口基本相同...MyLocal扩展了MyRemote,两个接口都相应地注释了@local和@remote)
在测试时EJB看起来像这样...

@Stateless
@Named
@Default
@Local(MyLocal.class)
@Remote(MyRemote.class)
public class MyEJB implements MyLocal, MyRemote { ... }

我还尝试像这样强制转换JNDI资源。

InitialContext ic = new InitialContext();
Object lookedUpEjb = ic.lookup(lookup); // the 'java:global...' from log
MyRemote jndiEjb = (MyRemote) PortableRemoteObject.narrow(lookedUpEjb, MyRemote.class)
// Tried also casting/checking 'instanceof' to MyLocal...

没有区别,同样的ClassCastException发生?!

<featureManager>
    <feature>javaee-7.0</feature>
    <feature>ldapRegistry-3.0</feature>
    <feature>localConnector-1.0</feature>
    <feature>adminCenter-1.0</feature>
    <feature>wsSecurity-1.1</feature>
    <feature>ejbLite-3.2</feature>
    <feature>ejbRemote-3.2</feature>
    <feature>cdi-1.2</feature>
    <feature>jpa-2.1</feature>
    <feature>jsf-2.2</feature>
    <feature>jaxrs-2.0</feature>
    <feature>jaxws-2.2</feature>
</featureManager>

共有1个答案

督德泽
2023-03-14

问题是每个应用程序都有一个不同的ClassLoader,绑定到JNDI的对象是用定义EJB的应用程序的ClassLoader加载的。

对于远程EJB接口来说,这不应该是一个问题,因为ORB应该为您解决这个问题。在返回这样一个对象的远程调用中,ORB将序列化该对象(来自目标类加载器),然后使用客户端类加载器反序列化。对于这样的查找,portableRemoteObject.naral也应该处理这个问题。这里的失败似乎只是宝珠中的一个bug。

为了支持对本地EJB接口的跨应用程序访问,需要将本地EJB接口移动到两个应用程序都使用的共享库中,或者将两个应用程序配置为使用单个全局类加载器。有关跨应用程序使用本地EJB接口的更多信息,请参见此链接:在websphere中查找本地EJB的正确方法--获取ClassCastException(注意:此链接讨论的是传统websphere,但Liberty的问题与使用共享库作为接口的解决方案相同)。

 类似资料:
  • 明确的强制转换 明确的 强制转换指的是明显且明确的类型转换。对于大多数开发者来说,有很多类型转换的用法可以清楚地归类于这种 明确的 强制转换。 我们在这里的目标是,在我们的代码中指明一些模式,在这些模式中我们可以清楚明白地将一个值从一种类型转换至另一种类型,以确保不给未来将读到这段代码的开发者留下任何坑。我们越明确,后来的人就越容易读懂我们的代码,也不必费太多的力气去理解我们的意图。 关于 明确的

  • 问题 如何使用和在PostgreSQL中提供小数点? 将字符串转换为十进制数需要什么函数? 使用的功能 第1功能 第一个错误 第二功能 第二个错误 第三功能 什么函数用于将字符串转换为数字? 编辑 看起来我有一个精神失误。粘位澄清说int没有小数!我从原来的帖子中删除了int位。

  • 我试图从java 9上的jListBox中删除一个项目,却一直得到一个异常提示 当我调用DefaultListModel=(DefaultListModel)list2.getModel(); 程序。。 例外在这里出现 …

  • 我有一个。mp4视频文件,包含高级3.1“avc1.64001f”视频和低复杂度AAC“mp4a.40.2”音频。 如何通过使用libfdk_aacFFmpeg编码器将低复杂度AAC转换为“HE-AAC”音频编解码器并保持/获得尽可能好的质量?我只想将“avc1.64001f”视频复制到目标文件中。

  • 我以json字符串的形式生成输入数据。 对于主题-myinput 我的班级是这样的: 我得到下面类铸造异常: 线程“countries-streaming-analysis-app-f7f95119-4401-4a6e-8060-5A138FFADB2-StreamThread-1”组织中的异常。阿帕奇。Kafka。溪流。错误。异常:流程中捕获到异常。taskId=0_0,processor=KS

  • 假设我有一个要转换为反应流的事件发出数据源。数据源由资源(例如,定期发送更新状态的套接字)绑定,所以我希望共享对该资源的单个订阅。使用带有回放的单个observable(新订阅者可以立即获得当前值)和refCount操作符似乎非常适合这样做。例如,这是他的MyDataProvider的外观: 然而,现在假设我有另一个数据源,它需要第一个数据源的结果来计算其自身的值: 在这里,我的设置开始崩溃。第一