客户端无法从服务器接收到异常的堆栈跟踪

客户端无法从服务器接收到异常的堆栈跟踪

问题描述:

下面发布的代码是引发http 500错误的客户端 - 服务器代码,这是由于服务器抛出一些异常。我实际上想发送异常(在服务器端产生)到客户端,以便知道http 500错误的原因。为了发送堆栈跟踪,我正在使用这一行return Response.status(200).entity(err).build();,但客户端没有打印任何内容。请参阅我的代码并告诉我如何从服务器获取引发异常的堆栈跟踪?客户端无法从服务器接收到异常的堆栈跟踪

ReactJS客户:

saveChanges(newRecordsArray) { 
     $.ajax({ 
      type: "POST", 
      url: "http://localhost:8080/UserManagement/rest/myService/save", 
      dataType: "json", 
      contentType:'application/json', 
      data: newRecordsArray, 
      async: false 
     }).then((function(err) { 
      {console.log(err);} 
     }).bind(this)); 
    } 

Java服务:

@POST 
    @Path("/save") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response saveNewRecords(JSONArray newRecordsArray) { 
     try { 
      File recordsFile = new File("C:\\Users\\username\\Desktop\\myJSON.txt"); 
      FileWriter fileWriter = new FileWriter(recordsFile); 
      fileWriter.write(newRecordsArray.toString()); 
      fileWriter.close(); 
     } 
     catch (Exception e) { 
      String err = e.getClass().toString(); 
      return Response.status(200).entity(err).build(); 
     } 
     return Response.status(200).entity(newRecordsArray.toString()).build(); 
    } 
+1

你为什么要发送200 OK catch块?你是否真的获得了堆栈跟踪?我不这么认为,至少是那个代码。 – Kayaman

为什么你只异常消息是因为Response.status(200).entity(err).build()调用你的例外对象的toString()方法的原因。

如果你想获得完整的堆栈跟踪作为一个字符串,那么我建议你使用一个外部库,它可以帮助你完成这项工作。

Apache Commons Lang图书馆可能是一个完美的选择。这是您需要使用的静态方法:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e) 

有关此方法的更多详细信息,请参阅here

我建议你送回去,而不是HTTP500的HTTP200:

String exceptionString = ExceptionUtils.getFullStackTrace(e); 
Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exceptionString).build();