gpt4 book ai didi

java - 具有日志记录和嵌套 EJB 调用的 EJB 拦截器

转载 作者:行者123 更新时间:2023-12-02 06:38:39 25 4
gpt4 key购买 nike

我正在尝试通过拦截器对 EJB 调用应用常规日志记录。此日志记录应该记录 bean 的安全主体。该方法使用 MDC,并将主体推送到 MDC,并在方法调用完成时将其删除。

但是,当在 EJB 内进行 EJB 方法调用时,此方法会失败。请参阅下面的演示代码。有没有解决这个问题的解决方案或更好的方法?

public class LoggingInterceptor {

@Resource
protected SessionContext sessionCtx;

@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
Principal principal = sessionCtx.getCallerPrincipal();
if (principal != null) {
MDC.put("USER_KEY", principal.getName());
}
try {
return ctx.proceed();
} finally {
MDC.remove("USER_KEY");
}
}
}

现在我尝试将其与 session bean 一起使用,如下所示:

@Stateless
@Interceptors(LoggingInterceptor.class)
public class Bean1 {

private static Logger logger = Logger.getLogger(Bean1.class);

@Resource
Bean2 bean2;

public String doSomething() {
logger.debug("Step1.");
bean2.doMore();
logger.debug("Step2.");

和 bean 2:

@Stateless
@Interceptors(LoggingInterceptor.class)
public class Bean2 {

private static Logger logger = Logger.getLogger(Bean2.class);

public String doMore() {
logger.debug("Step in Bean2.");

当直接调用 Bean2 时,日志记录起作用:

23:53:00,093 DEBUG [Bean2] [testuser] Step in Bean2. 

但是,当调用 Bean1 时,第二条日志语句不再包含用户,因为 UserKey 已被 Bean2 拦截的 finally block 从 MDC 中删除:

23:53:00,093 DEBUG [Bean1] [testuser] Step1.
23:53:00,193 DEBUG [Bean2] [testuser] Step in Bean2.
23:53:00,293 DEBUG [Bean1] [] Step2.

最佳答案

您可以在拦截器中继续操作之前存储以前的主体名称。

@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
Principal principal = sessionCtx.getCallerPrincipal();
String previousPrincipalName = MDC.get("USER_KEY");

MDC.put("USER_KEY", principal == null ? "" : principal.getName());

try {
return ctx.proceed();
} finally {
MDC.put("USER_KEY", previousPrincipalName);
}
}

关于java - 具有日志记录和嵌套 EJB 调用的 EJB 拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com