当前位置: 首页 > 知识库问答 >
问题:

通过SpringREST模板获取异常的堆栈跟踪

翟曦之
2023-03-14

我有两项服务-服务1服务2<代码>服务1通过SpringREST模板调用一些服务2API。现在服务2中发生了一些异常。我需要它在服务1中的整个堆栈跟踪。如何得到它?

Service 1  ---calls--> Service 2

Spring是否将堆栈跟踪传递到服务1

你可以说我是这样打电话的:

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String> entity = new HttpEntity<String>(headers);
return restTemplate.exchange("http://localhost:8080/products", HttpMethod.GET, entity, String.class).getBody();

共有3个答案

艾阳羽
2023-03-14

1) 在异常之前捕获特定的HttpServerErrorException和HttpClientErrorException,将异常对象一直传播到服务1或资源。

try {
 //code
} catch (HttpServerErrorException | HttpClientErrorException ex) {
throw new SystemException("Http Exception", ex.getResponseBodyAsString(), 
ex);
} catch (RuntimeException ex) {
throw new SystemException("RuntimeException", ex);
} catch (Exception ex) {
throw new SystemException("default exception block", ex);
}

2) 为您的系统和业务异常提供下面这样的异常映射器,可以捕获并记录所有错误消息。

   public class SystemException extends Throwable implements
        ExceptionMapper<Throwable> {

      @Override
      public Response toResponse(Throwable ex) {
         //code to handle exception
      }
贡英华
2023-03-14

总结一下一个简单的方法,它只不过是将Spring Boot的ZipkinSleuth启动程序添加到您的pom.xml中,以实现多个应用程序之间的双向日志跟踪...

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth</artifactId>
            <version>${spring-cloud-sleuth.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
</dependencies>
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

…并在应用程序中配置日志模式。属性以反映侦探在您的请求中注入的SpanIds和TraceIds…

logging.pattern.level=[%X{X-B3-TraceId}/%X{X-B3-SpanId}] %-5p [%t] %C{2} - %m%n

您还可以将自己的进度与Openzipkin的Github帐户上运行的示例进行比较。

也许你可以试一试,向我们展示你的经历和进步!

华和悦
2023-03-14

我需要它在服务1中的整个堆栈跟踪。如何得到它?

所以有很多方法可以实现,本质上你必须实现。您可以从service2获取JSON响应中的相关异常消息/跟踪。也就是说,当服务2结束时出现任何异常时,我们可以配置响应以发送相关异常信息。

在这篇文章中,有3个答案解释了不同的实现方法,还有这个。现在开始:

堆栈跟踪是否通过Spring传递到服务1?

通常,在处理web请求时引发的任何未处理/运行时异常都会导致服务器返回HTTP 500响应。

因此,答案是spring不会将堆栈跟踪传输到服务1,而是以错误HTTP500和最有可能的异常消息作为响应。

但是,您自己编写的任何异常都可以用@响应状态注释来注释(它支持由HTTP规范定义的所有HTTP状态代码)。

当一个带注释的异常从控制器方法抛出,并且没有在其他地方处理时,它将自动导致相应的HTTP响应返回指定的state-code并写入消息/跟踪。例如,

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Account")  // 404
public class AddressNotFoundException extends RuntimeException {
    // ...
}

下面是一个使用它的控制器方法:

@RequestMapping(value="/account/{id}", method=GET)
public String showOrder(@PathVariable("id") long id, Model model) {
    Account account = accountServices.findAccountById(id);

    if (account == null) throw new AddressNotFoundException(id);
    model.addAttribute(account);
    return "accountDetail";
}

如果此方法处理的URL包含未知帐户ID,则将返回熟悉的HTTP 404响应。

希望这有帮助。

 类似资料:
  • 问题内容: 最近,我问是否要报告捕获到的异常的文本。出乎意料的是,大多数答案都误解了我的问题,并以为我在问是否要报告堆栈跟踪以获取捕获的异常,这表明这样做是正常的。所以我要问一个后续问题。 在例外情况下,应该或不应该在什么情况下报告堆栈跟踪?通过“报告”,我包括要求一个日志记录框架为您记录堆栈跟踪 我不问是否报告 的东西 。我在问那个报告是否应该包括堆栈跟踪。 问题答案: 它取决于上下文。例如,当

  • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。

  • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

  • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

  • 在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti

  • 问题内容: Java的e.printStackTrace()不会打印内部异常的堆栈跟踪的所有详细信息。 有没有现成的方法来生成字符串形式的完整堆栈跟踪?(除了自己格式化外) 编辑 我刚刚发现printStackTrace()的作用-显然,它过滤掉的堆栈帧正是内部异常和外部异常共同的帧。因此,实际上这是我想要的,而不是“完整”堆栈跟踪。 问题答案: 我最终滚动了自己的代码(我采用了Throwable