【问题标题】:Inject user entity with EJB使用 EJB 注入用户实体
【发布时间】:2014-12-18 07:33:14
【问题描述】:

我在我的应用程序中使用 JAAS 身份验证。想想我有这样的用户实体类:

@Entity
public class User {
    @Id
    public Long id;

    public String name;

    ...

还有一个像这样的 REST API:

@Stateless
@LocalBean
@Path("/users")
public class Users {

    // INJECT USER OBJECT HERE
    @Inject
    private User user;

    @Path("/me")
    @Produces({ MediaType.APPLICATION_JSON })
    @GET
    public User getUser() {
        return user;
    }
    ...

我是否创建了一个 @Produces 方法来从 @SessionContext.getCallerPrincipal() 和 EntityManager 生成用户实体对象并将其直接注入到我想要的所有其余 api 中?

【问题讨论】:

  • User 是什么类?它是否映射到 JSON?

标签: java rest jakarta-ee ejb cdi


【解决方案1】:

当您将用户 id 保存为主体名称时,以下方式应该可以工作。 你需要一个qualifier 和一个生产者方法。一个好方法是创建另一个类来获取用户实体。

public class Resource {
  @Inject
  private EntityManager em;

  @Resource
  private SessionContext ctx;

  @Produces
  @Sessionscoped
  @Running // the qualifier
  public User getUser() {
    User user = em.find(User.class, ctx.getCallerPrincipal().getName());
    return user;
  }
}

在您的Users 类中,您必须使用限定符注释注入的用户。否则生产者方法的用户实体不能分配给注入。

@Inject
@Running
private User user;

【讨论】:

  • 我还是有问题。 ctx 为空,可能是因为方法是 SessiopnScoped 而不是类。我想将我的 User 对象(作为 RequestScoped 范围)注入 Jersey REST API 类(所以我将为每个请求拥有正确的 User 对象)。我做了几天我能想象的一切,没有任何效果:(
  • 这不是主要问题的答案,即:如何将用户信息发送到 EJB 上下文(实际上是从 HTTP 资源注入 ctx,这显然是可操作的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多