将值传递给注入的EJB

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将值传递给注入的EJB相关的知识,希望对你有一定的参考价值。

我有一个EJB应用程序,它包含两个bean,ServiceEJB(web层)和BusinessEJB(业务层),其中BusinessEJBis注入ServiceEJB

ServiceEJBreceives来自浏览器的HTTP请求,调用BusinessEJB中的方法,获取结果,并发送HTTP响应。

此外,ServiceEJB可以访问HttpSession对象,其中存储了登录用户的userIdBusinessEJBdoes无法访问HttpSession对象。

应用程序需要记录消息(例如,使用sl4j / logback)。它可以在ServiceEJBor BusinessEJB方法中记录消息,当它记录消息时,它必须在日志条目中包含会话的userId

由于BusinessEJB没有userId,它需要从ServiceEJB得到它。问题是实现这一目标的最佳方法是什么。我不想做的是在userId中为每个方法添加一个BusinessEJB字段作为参数,因为应用程序中有许多ServiceEJBs和BusinessEJBs(以及BusinessEJB调用的其他bean也生成日志条目),我不知道我想用userId字段污染应用程序。相反,我可以在EJB级别有一个userId字段,但是如何填充它们?有没有办法通过注释实现这一目标?欢迎任何建议。

@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
@Stateless
public class ServiceEJB {

    @Context
    HttpServletRequest httpRequest;

    @Inject
    private BusinessEJB bean;

    private String userId;

    @Path("someurl")
    public Response someMethod1() {
       final HttpSession session = httpRequest.getSession();
       // get the userId from the session

       String s = bean.someMethod2();

       // return Response
    }
}

@Stateless
public class BusinessEJB {

  private String userId;

  public String someMethod2() {
     // ....  log an entry with userId
     return "something";
  }   
}
答案

一些指示/评论:

  1. 如果与应用程序服务器安全性集成,则可以在任何组件上使用用户名。 EJB可以通过在注入的getCallerPrincipal()变体上调用EJBContext来获取它,这里是javax.ejb.SessionContext@Resource private SessionContext sessionCtx; Servlet可以从HttpServletRequest.getUserPrincipal()中检索主体。 JAX-RS组件(ServiceEJB)可以从javax.ws.rs.core.SecurityContext.getUserPrincipal()中检索它。 您是否有任何理由不与应用程序服务器安全性集成?
  2. 如果您有充分的理由不与应用程序服务器安全性集成,我会提出the previous answer解决方案的变体。变化是从应用于所有资源(servlet过滤器或JAX-RS ContainerRequestFilter)的过滤器设置用户数据,因此您不必担心在多个位置设置它。
  3. 如果您只需要用于记录的用户ID,我建议您在slf4j中查看映射诊断上下文(MDC)的概念。有了它,您可以在请求开始时尽早设置用户ID,然后将其用于所有日志记录语句。
另一答案

创建一个请求范围的CDI bean,即UserContext

将它注入两个EJB。

ServiceEJB中设置用户的id并在BusinessEJB中读取它。

以上是关于将值传递给注入的EJB的主要内容,如果未能解决你的问题,请参考以下文章

将值传递给“注入脚本”而不是依赖全局变量?

如何将值从片段/活动传递到 xml?

将值从回收器适配器传递到android中的片段

如何将值从一个片段的回收器视图项传递到另一个片段

带有 JPA/EJB 代码的“分离实体传递给持久错误”

java 将值/日期从活动传递到片段