在 Java EE 中与 EJB 交互的最佳方式

2024-01-29

我有一个中等规模的 Java EE 6 项目,它使用多个 EJB,其中一个唯一目的是通过 JPA 管理数据库调用。我的问题是添加执行一些随机功能的新类,然后调用数据库访问 EJB 来保存此类中的数据的最佳方法是什么。

如果这个新类需要访问注释和注入,它是否必须是 EJB?如果必须与项目的其余部分一起部署,它是否必须是 EJB?

有人告诉我,如果您想向项目添加新的逻辑类,它要么必须是 EJB,要么您可以使用 JNDI 远程集成它以访问 EJB 元素并创建某种客户端接口。现在我的新类只是一个 POJO,但它无法访问 EJB 功能。

一般情况下我应该做什么?

编辑:请注意我的问题不是关于数据库访问。这只是我正在使用的一个例子。我的问题更广泛。我想知道如何从我创建的其他类访问 EJB 方法。从一个 EJB 到另一个 EJB,您可以简单地注入另一个 EJB,因为它们都是容器管理的。但是假设我在与 EJB 相同的包中创建另一个类,我如何访问这些方法?有可能吗?这里的最佳实践是什么。

现在,我有一个类从 URL 获取 twitter feed 数据,然后解析 JSON 并返回前 10 个条目的字符串。我想调用管理数据库访问的 EJB 并将该字符串传递给其相应的方法,但我不能这样做,因为我的类不是 EJB。


EJB 通常用于实现任何类型的服务。它们与 JPA 集成得非常好,因此经常用于数据库访问,但这并不是它们的唯一用途。

EJB 通常是什么not适用于建模数据。 IE。它们应该是应用程序中的动词,而不是名词。因此以下是wrong:

@Stateless
@Entity
public class CreditCard { // silly, don't do this!

     @Id
     Long id; + getters/setters
     Data expiration date; + getters/setters
}

下面的更好,它是一项服务,当您的应用程序启动时,它会从某处获取一些报价数据:

@Singleton
@Startup
public class QuoteFetcher {

     private List<Quote> quotes; // + getter

     @PostConstruct
     public fetchQuote()
          quotes = SomeUrlBuilder.someUrl().getQuotes();
     }
 }

以下是强制性 DAO 示例:

@Stateless
public class JPAInvoiceDAO implements InvoiceDAO {

     @PersistenceContext
     private EntityManager entityManager;

     public Invoice getById(Long invoiceId) {
           return entityManager.find(invoiceId, Invoice.class);
     }

     // More DAO methods
}

下面显示了如何使用声明性安全性,以及 Bean 如何查找已从外部映射到其私有上下文 (ENC) 的内容:

@Stateless
public class TokenFetcher

    @Resource
    private SessionContext sessionContext;

    @RolesAllowed("SYSTEM")
    public Token getToken() {
        return (Token) sessionContext.lookup("token");
    }
}

问题的第二部分似乎是如何在代码中使用这些 bean。基本上有四种方法:

  1. 注入托管 Bean
  2. 通过 JNDI 引导
  3. 启动时自动调用
  4. 通过定时器自动

注入是最简单的方法,但只有托管 bean 才是注入候选者(基本上意味着 Java EE 框架创建 bean,并且您不使用new()实例化它)。

例如。注射:

@ManagedBean
public class InvoiceBacking {

     private Long invoiceId; // + getter/setter
     private Invoice invoice; // + getter

     @EJB
     private InvoiceDAO invoiceDAO;

     @PostConstruct
     public void init() {
          invoice = invoiceDAO.getById(invoiceId);
     }
 }

(另见JSF 2.0中的通信#处理GET请求参数 http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ProcessingGETRequestParameters)

通过 JNDI 引导:

 public class SomeQuartzJob implements Job {

     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
          InvoiceDAO invoiceDAO = (InvoiceDAO) new InitialContext().lookup("java:global/myApp/myEJB/InvoiceDAO");
          List<Invoice> openInvoices = invoiceDAO.getAllByOpenStatus();
          // verbose exception handling and closing JNDI context omitted for brevity
     }
  }

前面展示的 @Singleton bean 是 Java EE 框架如何在启动时调用代码本身的示例。对于自动计时器,您可以在 bean 的方法上使用 @Schedule 注释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java EE 中与 EJB 交互的最佳方式 的相关文章

  • Flink Kafka - 如何使应用程序并行运行?

    我正在 Flink 中创建一个应用程序 读取某个主题的消息 对其进行一些简单的处理 将结果写入不同的主题 我的代码确实有效 然而它不并行运行我怎么做 看来我的代码只在一个线程 块上运行 在 Flink Web 仪表板上 应用程序进入运行状态
  • Webdriver 和 Chrome:DevToolsActivePort 文件不存在

    我正在尝试安装 配置 Selenium 以在队友不在办公室时进行一些 UI 测试 我已经安装了 Selenium Webdriver 和 Eclipse 以及 Chrome Firefox 和 Edge 浏览器驱动程序 我有一些非常简单的脚
  • 无法解析符号“AuthUI”

    我正在添加 firebase google 和 Gmail 登录 但是当我粘贴代码时 onAuthStateChanged NonNull FirebaseAuth firebaseAuth 方法我收到此错误 无法解析符号 AuthUI 在
  • Spring:url 无法正确解析链接

    尽管我对 Java 有丰富的经验 但我对 Spring 框架和 Web 应用程序还很陌生 当我在本地 tomcat 服务器上运行我的网站时 URL 为 http localhost 8080 myApp 现在 请求映射将我委托到我的主页 R
  • 使用synchronized关键字和lock有什么区别[重复]

    这个问题在这里已经有答案了 Java 5引入了lock方法 与synchronized关键字相比 使用lock有什么优点和缺点 同步 将锁定该方法内访问的任何资源 lock 允许您进行更精细的控制 例如 仅锁定某些资源 或者仅在满足特定条件
  • 如果主键不为空,Spring data JPA不允许实体被持久化

    我有一个订阅者实体 它使用用户提供的电子邮件地址作为主键而不是自动生成的值 这意味着当调用JpaRepository的save方法时 主键值为not null 春季数据JPA文档 http docs spring io spring dat
  • 如何解决 javax.net.ssl.SSLHandshakeException 错误?

    我通过 VPN 连接来设置库存 API 来获取产品列表 效果很好 一旦我从网络服务获得结果并绑定到用户界面 而且我将 PayPal 与我的应用程序集成在一起 以便在我拨打电话付款时进行快速结帐 但我遇到了此错误 我使用 servlet 进行
  • 在哪里使用 EJB 3.1 和 CDI?

    我正在制作一个基于 Java EE 的产品 我在其中使用玻璃鱼 https en wikipedia org wiki GlassFish3 和 EJB 3 1 我的应用程序有会话bean https en wikipedia org wi
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa
  • 如何在 Spring Security 中创建自定义身份验证过滤器?

    我正在尝试创建一个自定义 Spring Security 身份验证过滤器以实现自定义身份验证方案 我花了几个小时阅读 Spring Security 但我找到的所有指南都解释了如何配置基本设置 我正在尝试编写自定义设置 但无法找到有关如何执
  • 仅在文件下载完成后设置 cookie。

    我有一个场景 我想告诉用户下载完成并提示关闭按钮 为此 我使用 jquery 插件来连续监视 cookie 以了解下载何时完成 我的问题是我想设置这个cookie fileDownload true and path 下载完成后立即进行 为
  • JUnit 集成测试的“IT.java”文件名后缀(而不是“Test.java”)是否是一种约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我习惯于用一个名称来命名我的 JUnit 集成测试 Test java最后例如DatabaseConnectionTest java并将它们放在
  • 使用 Spring Java 配置自动装配 bean

    是否可以使用Spring的 Autowired用 Java 编写的 Spring 配置中的注释 例如 Configuration public class SpringConfiguration Autowired DataSource d
  • 针对未经身份验证的用户的 Spring Security 404 页面

    我正在使用 Spring Boot 和 Thymeleaf 我有一个自定义 404 模板页面定义在src main resources templates error 404 html 当用户登录时这可以正常工作 然而 当他们注销时 他们不
  • 为数组生成随机索引

    我知道对于普通整数来说这是这样 但是有索引这样的东西吗 Random dice new Random int n dice nextInt 6 System out println n 你是什 么意思 数组索引是普通数字 所以你可以轻松地做
  • Selenium WebDriver (java) 可以与浏览器的检查工具元素选择器交互吗?

    通过使用 selenium 我可以访问位于检查选项卡中的浏览器元素选择器 在浏览器中按 Ctrl Shift C 吗 我想使用该选择器 指向 一个元素 并使其在浏览器中突出显示 例如 简单的事情如下 WebElement elem driv
  • web.xml 过滤器如何工作?您可以将两个过滤器映射到所有页面 (/*) 并指定顺序吗?

    我想使用 Spring Security 它说将过滤器映射到 但我已经有一个映射到 的过滤器 即 Tuckee URLRewrite 过滤器 是否可以将两个过滤器映射到同一事物 并且有没有办法指定过滤器的调用顺序 是的你可以 servlet
  • 使用具有透明度的 IndexColorModel 绘制图像

    这是我的问题 我想在基于具有透明度的 IndexColorModel 的 BufferedImage 上应用转换 平移 旋转 剪辑 索引 0 是我的透明像素 索引 1 是黑色 索引 2 是白色 依此类推 源图像 即在转换之前 被实例化如下
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只
  • Spring Boot 应用程序崩溃

    请告诉我哪里有问题 我尝试启动我的第一个在 Spring Boot 上开发的应用程序 我已经在 SpringMVC 上有了简单的 Web 项目 现在我喜欢在 BOOT 上构建它 这是错误输出 org springframework bean

随机推荐