Java 在运行时,是否有办法检查哪个API/控制器方法导致了Spring Boot应用程序中的当前执行点?
本质上,我在Spring Boot应用程序中实现了一些动态日志记录,需要记录服务层中放置的异常,基于API调用导致在服务层中某个地方的方法执行期间抛出异常。我想知道我是否可以在这个方法中检查哪个API将我们引导到当前的执行点 我知道我可以使用stack trace从本质上追溯到导致当前执行点的特定控制器方法,但是这涉及一些糟糕的代码,我正在积极检查StackTraceeElement是否包含“.Controller”作为子字符串。此外,如果涉及递归,stacktrace可能非常长,从而导致效率低下。还有其他选择吗?或者这种方法能更有效/更干净吗 控制器:Java 在运行时,是否有办法检查哪个API/控制器方法导致了Spring Boot应用程序中的当前执行点?,java,spring,rest,spring-boot,spring-mvc,Java,Spring,Rest,Spring Boot,Spring Mvc,本质上,我在Spring Boot应用程序中实现了一些动态日志记录,需要记录服务层中放置的异常,基于API调用导致在服务层中某个地方的方法执行期间抛出异常。我想知道我是否可以在这个方法中检查哪个API将我们引导到当前的执行点 我知道我可以使用stack trace从本质上追溯到导致当前执行点的特定控制器方法,但是这涉及一些糟糕的代码,我正在积极检查StackTraceeElement是否包含“.Controller”作为子字符串。此外,如果涉及递归,stacktrace可能非常长,从而导致效率低
@PostMapping(value = "/apiOne")
public Response exchangeApi1(){
....
someService.doMethod(params);
....
}
@PostMapping(value = "/apiTwo")
public Response exchangeApiTwo(){
....
someService.doMethod(params);
....
}
服务层:
@Service
public class SomeService {
....
public void doMethod(params){
....
String api = getCallingAPI()//I need this method. Does such a thing exist in native Spring libraries?
switch (api) {
case "apiOne":
LOG.error(Alert Level 1);
break;
case "apiTwo":
LOG.error(Alert Level 3);
break;
throw BusinessException();
.....
}
......
}
我需要一些基本上可以作为上面代码段中的getCallingAPI()方法工作的东西
编辑:我意识到我显然可以将API名称作为参数传递,但我忘了提到的是doMethod()/引发的异常可能是几个服务层,并且API名称对于最终导致doMethod/无论在何处引发异常的许多方法来说都是无用的。我需要更干净的东西。一种可能是使用日志框架(如slf4j/logback)的(映射的诊断上下文)。MDC基于每个线程存储数据,因此对于每个用户请求,这是存储上下文信息的简单方法 在调用API时,您可以在上下文中设置所需的信息,并在离开方法之前从MDC中清除这些信息
import org.slf4j.MDC;
...
@PostMapping(value = "/apiOne")
public Response exchangeApi1() {
MDC.put("api", "exchangeApi1");
....
someService.doMethod(params);
....
MDC.remove("api");
}
一个更好、更干净的方法是将这种行为提取到一个数据库中,或者减少样板文件
在doMethod()中,您可以通过以下简单方式访问api信息:
MDC.get("api");
要在日志输出中包含MDC信息,可以相应地配置附加器。可以在中找到logback的示例 如果将API名称解析为doMethod()的一个参数会怎么样?@Asankasanjaya抱歉,我应该更具体一些。doMethod()的实现可以是几个服务层,因此作为参数传递API名称将不会被多个方法使用,从而导致doMethod()的最终执行。有没有更干净的方法?