0
我在服務器端使用了ExceptionMapper
,將自定義異常放在響應的正文中。我如何在客戶端檢索原始異常並將其發送給調用者?如何從澤西島檢索映射的異常?
我在服務器端使用了ExceptionMapper
,將自定義異常放在響應的正文中。我如何在客戶端檢索原始異常並將其發送給調用者?如何從澤西島檢索映射的異常?
可以序列異常,並把它作爲響應的一部分:
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;
}
然後在客戶端,你應該做的正好相反:
byte[]
ByteArrayInputStream
ObjectInputStream
readObject()
任何你想讓它在客戶端PS異常
byte[]
s) - >只需使用StreamingOutput
作爲.entity()
並寫入提供的輸出流而不是ByteArrayOutputStream
。這同樣適用於客戶端的反序列化。
這正是我最終做的。我有一個服務定位器,可以捕獲這些呼叫,但我期望在客戶端可以使用某種澤西映射器來輕鬆完成。過濾器也不好,我不能拋出異常。 – MarcioB