【发布时间】:2019-03-28 00:15:25
【问题描述】:
我有一个 EJB 应用程序,它包含两个 bean,ServiceEJB(Web 层)和 BusinessEJB(业务层),其中 BusinessEJB 被注入到 ServiceEJB 中。
ServiceEJB接收来自浏览器的HTTP请求,调用BusinessEJB中的方法,获取结果,发送HTTP响应。
此外,ServiceEJB 可以访问 HttpSession 对象,其中存储了登录用户的 userId。 BusinessEJB 无权访问 HttpSession 对象。
应用程序需要记录消息(例如,使用 sl4j/logback)。它可以在ServiceEJB或BusinessEJB方法中记录消息,当它记录消息时,它必须在日志条目中包含会话的userId。
由于BusinessEJB 没有userId,它需要从ServiceEJB 获取。问题是实现这一目标的最佳方法是什么。我不想做的是在BusinessEJB 中的每个方法中添加一个userId 字段作为参数,因为应用程序中有很多ServiceEJBs 和BusinessEJBs(以及由@ 调用的其他bean 987654342@ 也会生成日志条目),我不想用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";
}
}
【问题讨论】:
标签: java jakarta-ee java-8 ejb cdi