2017-10-17 508 views
0

下面發佈的代碼是引發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

回答

2

爲什麼你只異常消息是因爲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();