2017-03-08 82 views

回答

1

可以序列異常,並把它作爲響應的一部分:

public final class SerializingExceptionMapper implements ExceptionMapper<Exception> { 
    @Override 
    public Response toResponse(Exception exception) { 
     try { 
      final byte[] serializedException = serializeException(exception); 
      final String base64EncodedException = Base64.getEncoder().encodeToString(serializedException); 

      return Response.status(Response.Status.INTERNAL_SERVER_ERROR) 
        .entity(new Message(base64EncodedException)) 
        .build(); 
     } catch (Exception ex) { 
      return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); 
     } 
    } 

    private byte[] serializeException(Exception ex) throws IOException { 
     final ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     final ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(ex); 
     oos.close(); 
     return bos.toByteArray(); 
    } 
} 

final class Message { 
    public Message(String exception) { 
     this.exception = exception; 
    } 

    public String exception; 
} 

然後在客戶端,你應該做的正好相反:

  • 解組(也許JSON)響應
  • 將base64編碼異常解碼爲byte[]
  • 反序列化異常
    • 創建ByteArrayInputStream
    • 創建ObjectInputStream
    • 只是readObject()任何你想讓它在客戶端

PS異常

  • 行動:這可以在沒有任何緩衝的實現(即沒有byte[] s) - >只需使用StreamingOutput作爲.entity()並寫入提供的輸出流而不是ByteArrayOutputStream。這同樣適用於客戶端的反序列化。

  • +0

    這正是我最終做的。我有一個服務定位器,可以捕獲這些呼叫,但我期望在客戶端可以使用某種澤西映射器來輕鬆完成。過濾器也不好,我不能拋出異常。 – MarcioB