2017-03-08 39 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