【问题标题】:Use an EJB from application server in JAX-RS在 JAX-RS 中使用来自应用程序服务器的 EJB
【发布时间】:2019-06-17 11:22:16
【问题描述】:

我有一个 Payara5 应用服务器正在运行。我已经部署了一个包含一个无状态 EJB 的 JAR。

我有第二个 Java EE 项目,它是一个 JAX-RS。资源类之一需要访问此 EJB。

我正在使用 Maven。因此,对于引用 EJB 项目的 JAX-RS 应用程序,我在 pom.xml 中添加了依赖项。

<dependency>
    <groupId>diagro.be</groupId>
    <artifactId>HelloWorld</artifactId> <!-- EJB project -->
    <version>1.0</version>
    <scope>provided</scope>
</dependency>

在我的资源类中,我注入了 EJB。

@Inject HelloWorld hw;

JAX-RS 编译,war 包被构建。在部署时,我收到未找到 HelloWorld 类的错误。

我做的有可能吗?还是我需要做其他事情才能链接?

【问题讨论】:

  • 为什么HelloWorld 的作用域配置为provided?有理由这样做而不是compile ??您希望 EJB JAR 在您的 WAR 应用程序旁边运行吗?
  • 是的,ejb 需要在战争应用程序旁边运行。因为我希望它也可以在另一场战争中运行 ejb。我将其配置为“提供”,因为我认为这是正确的选择???
  • 为什么每个 WAR 不能有自己的 EJB jar 副本?

标签: java jakarta-ee payara


【解决方案1】:

我做的有可能吗?还是我需要做其他事情才能链接?

有可能,但你首先需要一些东西:

  1. 你的 HelloWorld 类应该实现一个interface;让我们叫IHelloWorld。此类接口将定义您希望向 API 客户端公开的 EJB 方法...

  2. 1234563要在另一个应用程序中调用 EJB,应该使用 @Remote ...您可以在 here 中阅读更多内容
  3. 然后,您应该在一个通用项目中为您的 WAR 应用程序和 EJB 应用程序创建这样的接口。让我们调用这个项目:my-proj-interfaces ...

  4. 稍后,在您的 EJB 和 WAR 项目中,您创建一个对该项目的依赖项,其范围为 compile

  5. 在 EJB 项目中将有实现 IHelloWorld 接口的 HelloWorld 类。

  6. 在您的 WAR 项目中将是 IHelloWorld 消费者;让我们称之为HelloWorldClient ...该类将是这样的:

    public class HelloWorldClient {
        @EJB(lookup=xxx)
        private IHelloWorld ejbService;
    }
    

关键是@EJB注解和lookup属性的使用,这表明如何在你的服务器中定位你的EJB...通常,lookup属性的值将是JNDI条目您的服务器用来发布 EJB(检查服务器文档以找到该属性的正确值)...

  1. 应该就是这样(注意:这是我在 wildfly 中所做的...我希望在您的服务器中也适用相同的程序,因为我所说的都是标准的)...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多