【问题标题】:What is the best way to use Restful and CDI working together?使用 Restful 和 CDI 协同工作的最佳方式是什么?
【发布时间】:2015-07-07 21:10:00
【问题描述】:

我尝试使用 CDI 和 Restful 一起构建一个项目(从 CDI bean 发布一个 Restful 服务),但我找不到这样做的方法。

有人知道他们如何在没有 EJB 的情况下协同工作?

【问题讨论】:

  • 想到了带有 JDBC 的 POJO。
  • 我不明白你的意思,为什么是 JDBC?
  • 您的问题需要更多细节。我假设您需要数据库交互。例如,您可以使用 CDI 将 JDBC 资源注入 POJO。
  • 不行,我需要使用 CDI bean 发布一个 Restful 服务。
  • CDI 通常与状态和生命周期相关联。 RESTful 服务通常在设计上是无状态的。

标签: java web-services rest jakarta-ee cdi


【解决方案1】:

说到 Restful,我假设你是指 Jax-RS。取以下代码:

UserResource.java

此类实现 RESTful API 访问用例 GetUser 并返回其结果。

@Path("users")
@ApplicationScoped
public class UserResource {

    @Inject
    private GetUser getUser;

    @GET
    public Response getUser(@QueryParam("userId") String userId) {
        return UserRepresentationMapper.toRepresentation(getUser.getUser(userId);
    }
}

GetUser.java

GetUser 用例使用一些依赖项(此处为 UserService)来获取其数据并对其进行处理。

@ApplicationScoped
public class GetUser {

    @Inject
    private UserService userService;

    public ApplicationUser getUser(String userId) {
        // ...
    }
}

并在您的META-INF (jar) 或WEB-INF (war) 目录中有一个beans.xml 来激活CDI(使用JEE7 时不需要JEE6、beans.xml 并且您的所有类都使用bean @987654322 进行注释@)。

【讨论】:

  • 谢谢,我在 UserResource 类上添加了一个 socpe 注释,它可以工作了。
  • 除非我尝试这样做(即有应用程序范围的 CDI bean 并且有应用程序范围的 RESTful 服务来注入它),我得到了该应用程序范围的 CDI bean 的两个副本:一个是在应用程序启动 - 这是注入 Restful bean 的那个,当用户使用 CDI 会话 bean 从 Web 交互开始与应用程序交互时创建另一个,该会话 bean 也注入该 CDI 应用程序 bean。多可惜。 :((使用 EE8)
  • 哦,我知道原因了。应用程序范围的 CDI bean 中的一种方法不是公开的。它在同一个包中,因此可以调用它,但是当从会话范围的 CDI bean 调用它时,会创建应用程序范围的 CDI bean 的新副本!该方法公开后,现在我只获得了一个应用程序范围的 CDI bean 实例。
猜你喜欢
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2014-09-17
  • 2011-12-10
  • 2016-04-12
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多