Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时,是否有办法检查哪个API/控制器方法导致了Spring Boot应用程序中的当前执行点?_Java_Spring_Rest_Spring Boot_Spring Mvc - Fatal编程技术网

Java 在运行时,是否有办法检查哪个API/控制器方法导致了Spring Boot应用程序中的当前执行点?

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可能非常长,从而导致效率低

本质上,我在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()的最终执行。有没有更干净的方法?