EJB工厂类

2024-01-04

我正在尝试创建一个 EJB 工厂类,其工作方式如下:您有一个方法,该方法将 EJB 的类作为参数,然后它检查 EJB 是否具有远程接口(如果没有抛出异常),以及是否有远程接口。确实如此,它返回相关的 EJB。

下面的代码正是这样做的。然而,它返回的对象是相关 bean 的远程接口的类型,而不是 bean 本身的类型。我怎样才能改变这个?有没有办法告诉 Java 泛型类型 T 与传递给方法的类具有相同的类型。

import java.util.Properties;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.naming.*;


public class EJBFactory
{

    private InitialContext ctx;

    public EJBFactory() throws NamingException {
        ctx = new InitialContext();
    }

    public EJBFactory(String host, String port) throws NamingException {
        Properties props = new Properties();
        props.setProperty("org.omg.CORBA.ORBInitialHost", host);
        props.setProperty("org.omg.CORBA.ORBInitialPort", port);
        ctx = new InitialContext(props);
    }
.
    // To improve: The object returned should be of the type ejbClass
    // instead of the remote interface, which it implements
    public <T> T createEJB(Class ejbClass) throws NamingException
    {
        Class remoteInterface = null;
        for(Class interface_: ejbClass.getInterfaces()) {
            if(interface_.isAnnotationPresent(Remote.class))
                remoteInterface = interface_;
        }

        if(remoteInterface == null)
            throw new  IllegalArgumentException(
                "EJB Requires a remote interface");

        // Get the stateless annotation, then get the jndiName
        Stateless stateless =
            (Stateless)ejbClass.getAnnotation(Stateless.class);
        String jndiName = stateless.mappedName();
        T ejbObj = (T) ctx.lookup(jndiName);
        return ejbObj;
    }

}

使用工厂的单元测试示例。

import junit.framework.TestCase;


public class SimpleEJBTest extends TestCase
{
    TestRemote testBean;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        EJBFactory ejbFactory = new EJBFactory();
        testBean = ejbFactory.createEJB(TestBean.class);
    }

    public void testSayHello() {
        assertEquals("Hello", testBean.sayHello());
    }
}

注意:该示例适用于 Glassfish,我没有使用任何其他应用程序服务器对其进行测试。


EJB 的客户端通过 EJB 实现的本地/远程接口与它们交互。客户端应用程序永远无法直接访问实际的会话 bean 类实例。这样做是为了使实例池成为可能,容器可以重用 EJB 实例来服务不同的请求。

我不确定为什么您需要访问实际 bean 的对象(因为显然我不知道您的要求)。但如果您仍然需要创建一个实例,您可以使用反射按如下方式完成Class.forName(className).newInstance();同样,您像这样创建的实例不是 EJB。它只是一个 POJO,仅此而已。

EDIT- 在您对 junit 测试发表评论之后:当您按如下方式从 JavaSE 访问业务方法时,您实际上是在调用 EJB 中的方法 - 只是通过接口进行交互。因此,如果您想测试任何业务方法,您仍然可以通过在 Junit 测试中通过 JNDI 查找获得的对象来进行测试。

//MyGreatBean implements MyGreat. MyGreat has @Remote, MyGreatBean has @Stateless
ref = jndiContext.lookup("MyGreatBean/remote");
MyGreat bean = (MyGreat) ref; 
String retValue = bean.businessMethod();
assertEquals("Success", retValue);

从之前的评论中,我感觉到您想要检查实际 EJB 类中添加了哪些类型的注释 - 如果您想在不实际运行业务方法的情况下进行此类检查,则可以使用 Class.eJB 类创建一个实例。 forName...就像我上面提到的那样。当您创建这样的实例时,您只能调用不执行任何“Java EE”操作的方法。例如,您可以调用 EJB 类中的方法,如下所示

public String someMethod(){
       return "I am a POJO but I look like an EJB";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EJB工厂类 的相关文章

随机推荐

  • Android Rooms - 在字符串中搜索

    在 Android Rooms 持久性库中 如何将以下 SQL 语句编写为 Query SELECT FROM table WHERE field LIKE value 该语法无效 我在文档中找不到任何有关它的信息 您可以使用 SQLite
  • 推送到达时显示警报

    当来自 C2DM 或 GCM 的推送通知到达时 如何显示警报 现在我正在状态栏上显示通知 那么我怎样才能收到通知作为警报 在用户正在做的事情中间弹出一个对话框是一种对用户非常敌意的行为 如果他们正在玩 愤怒的小鸟 而你破坏了他们的拍摄怎么办
  • 批处理:从动态数组中解析出文件路径[重复]

    这个问题在这里已经有答案了 寻找从特定点解析出路径 然后使用它来填充动态数组 Example Folder tree C Main folder1 C Main folder2 folder2 1 C Main folder3 folder
  • 使用“python -m pip”而不是“pip”有什么效果? [复制]

    这个问题在这里已经有答案了 当我使用python m pip install
  • 不调用复制构造函数[重复]

    这个问题在这里已经有答案了 考虑给定的代码 struct ABC ABC std cout lt lt Calling from default constructor ABC const ABC copy std cout lt lt C
  • 使用 std::bitset 进行双重表示

    在我的应用程序中 我试图显示双变量的位表示 它适用于较小的双变量 不适用于 10 30 级别 Code include
  • 在Eclipse中,如何从使用“android库项目”的项目源快速访问它的源?

    项目A是我工作区中的一个android库项目 通过项目属性 gt android gt 库 是库 项目 A 声明 classA 项目 B 使用项目 A 通过项目属性 gt android gt 库 添加 Project B instanti
  • use_for_lated_fields 在 Django 中如何工作?

    我无法从文档中理解这一点 我完全不清楚 更具体地说 这是一个全局设置吗 因此 如果我在其中一个模型管理器上指定此属性 它是否会被所有模型类全局使用 如果不是全局设置 那么哪些关系到底会受到影响 是否可以让一名模特经理负责一种关系 而另一名模
  • 多关系无法在 Play 框架的映射表中保存映射的 id

    我正在使用 play2 2 1 并尝试在之间创建 ManyToMany 关系Jobads and 职位类别 models My 工作任务 java package models Entity public class Jobads exte
  • “找不到资源...”尝试编译空白的跨平台 Xamarin 应用程序

    我正在使用 VS Community 2015 更新 3 我通过 VS 安装程序安装了 Xamarin v4 2 然后通过 Xamarin 安装程序更新到 4 2 1 60 我创建了一个新的跨平台项目 Blank App Xamarins
  • 使用循环求和

    我的目标 编写一个应用程序 使用 while 循环从用户获取 20 个输入并显示所有这些数字的总和 我知道如何执行 while 循环 但我不知道如何获得所有这些数字的总和 因为变量是相同的 这是我到目前为止所拥有的 Scanner Numb
  • Android Studio:如何增加logcat文本的大小?

    有人知道在哪里可以增加 logcat 文本的大小吗 主设置里没有这个设置 转到文件 gt 设置 gt 编辑器 gt 颜色和字体 gt 控制台字体 Though to change the saved settings you will ha
  • c89:将 int 转换为 void* 并返回

    首先 这不是一个骗局 将 int 转换为 void 指针并再次返回 int 是否安全 https stackoverflow com questions 3568069 is it safe to cast an int to void p
  • 我违背了我的诺言

    所以 我在学习如何 Promise 方面遇到了最困难的时期 我在用着bluebird https github com petkaantonov bluebird https github com petkaantonov bluebird
  • DialogFragment 上的 Up ActionBar 操作

    我有一个DialogFragment使用全屏样式setStyle STYLE NORMAL R style Theme App The DialogFragment显示良好 但向上动作 homeAsUpActionBar 上的操作 不起作用
  • 学说中的 Dql 选择 vs sql 查询

    与本机 sql 相比 在学说中的 select 语句中使用 DQL 有什么好处 e g qb em gt getRepository repositoryname gt createQueryBuilder r qb gt someDqlC
  • 构建步骤“Windows PowerShell”将构建标记为失败,为什么?

    以下是 Jenkins 中运行的三个 PowerShell 命令以及构建结果 为什么会失败 哪个命令可能会失败 我读过这篇文章 执行 Shell 如何 何时在 Jenkins 中将构建标记为失败 https stackoverflow co
  • 在实例之间共享存储

    我正在使用 Engine Yard AppCloud 服务 如果我希望我的实例共享存储 例如用于文件上传 下载 将 S3 集成构建到我的应用程序中是我唯一真正的选择吗 目前 应用程序期望使用 filsystem 但看起来多个实例无法挂载相同
  • 如何在滚动后放置窗口的div中心[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个 div 即使在滚动后 它也应该位于窗口的中心 如何实现 http www flickr com photos 4169535
  • EJB工厂类

    我正在尝试创建一个 EJB 工厂类 其工作方式如下 您有一个方法 该方法将 EJB 的类作为参数 然后它检查 EJB 是否具有远程接口 如果没有抛出异常 以及是否有远程接口 确实如此 它返回相关的 EJB 下面的代码正是这样做的 然而 它返