java - 将值传递给注入的 EJB
问题描述
我有一个 EJB 应用程序,它包含两个 bean,ServiceEJB
(Web 层)和BusinessEJB
(业务层),其中BusinessEJB
注入了ServiceEJB
.
ServiceEJB
接收来自浏览器的 HTTP 请求,调用 中的方法BusinessEJB
,获取结果,发送 HTTP 响应。
此外,ServiceEJB
可以访问存储登录用户的HttpSession
对象的对象。无权访问该对象。userId
BusinessEJB
HttpSession
应用程序需要记录消息(例如,使用 sl4j/logback)。它可以记录消息ServiceEJB
或BusinessEJB
方法,当它记录消息时,它必须userId
在日志条目中包含会话的。
由于BusinessEJB
没有userId
,它需要从ServiceEJB
. 问题是实现这一目标的最佳方法是什么。我不想做的是在userId
每个方法中添加一个字段BusinessEJB
作为参数,因为应用程序中有很多ServiceEJB
s 和BusinessEJB
s (以及由它调用的其他 beanBusinessEJB
也会生成日志条目),我不想要污染该userId
领域的应用程序。相反,我可以userId
在 EJB 级别拥有一个字段,但是如何填充它们呢?有没有办法通过注释来实现这一点?任何建议都将受到欢迎。
@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";
}
}
解决方案
一些指针/评论:
如果您与应用程序服务器安全性集成,则用户名可在任何组件中使用。EJB 可以通过调用
getCallerPrincipal()
的注入变体来获取它EJBContext
,这里是javax.ejb.SessionContext
:@Resource private SessionContext sessionCtx;
Servlet 可以从
HttpServletRequest.getUserPrincipal()
. JAX-RS 组件(ServiceEJB
)可以从javax.ws.rs.core.SecurityContext.getUserPrincipal()
.您是否有任何理由不与应用程序服务器安全性集成?
如果您有充分的理由不与应用程序服务器安全性集成,我会建议对上一个答案的解决方案进行变体。变体是从应用于所有资源的过滤器(servlet 过滤器或 JAX-RS
ContainerRequestFilter
)中设置用户数据,这样您就不必担心在多个地方设置它。如果您只需要用于记录的用户 ID,我建议您查看 slf4j 中映射诊断上下文 (MDC) 的概念。有了它,您可以在请求开始时尽早设置用户 ID,并使其可用于此后的所有日志记录语句。
推荐阅读
- python - python中的键盘输入数据类型
- oracle - 在 oracle 中,如果另一个存储过程(在第一个过程中被调用)失败,存储过程是否无法进一步执行
- tomcat - ApacheTomcat - 301 重定向
- java - javax.net.ssl.SSLPeerUnverifiedException:对等点仅在生产服务器上未经过身份验证
- arrays - 如何实现对哈希数组的所有可能修改
- android - UnhandledPromiseRejectionWarning:错误:ENOSPC:设备上没有剩余空间,请观看
- maven - 无法让某些功能文件标签通过 TeamCity 运行
- python-install - 即使没有将 python 3.7 和启动器添加到路径中,也可以在命令行中打开 python 解释器
- javascript - Issue while converting array from one format to another
- service - UDS SID2E & SID22