Java 如何从jersey检索映射的异常?

Java 如何从jersey检索映射的异常?,java,jersey,jax-rs,Java,Jersey,Jax Rs,我在服务器端使用了一个ExceptionMapper,将自定义异常放在响应的主体中。如何在客户端检索原始异常并将其抛出调用方?您可以序列化异常并将其作为响应的一部分: public final class SerializingExceptionMapper implements ExceptionMapper<Exception> { @Override public Response toResponse(Exception exception) {

我在服务器端使用了一个
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;
}
public final类SerializingExceptionMapper实现ExceptionMapper{
@凌驾
公众响应(例外){
试一试{
最终字节[]serializedException=serializeException(异常);
最终字符串base64encodexception=Base64.getEncoder().encodeToString(serializedException);
返回Response.status(Response.status.INTERNAL\u SERVER\u错误)
.entity(新消息(Base64EncodeXception))
.build();
}捕获(例外情况除外){
返回Response.status(Response.status.INTERNAL_SERVER_ERROR).build();
}
}
私有字节[]序列化异常(异常ex)引发IOException{
final ByteArrayOutputStream bos=新建ByteArrayOutputStream();
最终ObjectOutputStream oos=新ObjectOutputStream(bos);
oos.writeObject(ex);
oos.close();
返回bos.toByteArray();
}
}
最终类消息{
公共消息(字符串异常){
this.exception=异常;
}
公共字符串异常;
}
然后在客户端,您应该执行相反的操作:

  • 解组(可能是JSON)响应
  • 将base64编码的异常解码为
    字节[]
  • 反序列化异常
    • 创建一个
      ByteArrayInputStream
    • 创建
      ObjectInputStream
    • 只需
      readObject()
      异常
    • 在客户端,你想用它做什么就做什么

PS:这可以在没有任何缓冲的情况下实现(即没有
字节[]
s)->只需使用
流输出
作为
.entity()
并写入提供的输出流,而不是使用
ByteArrayOutputStream
。这同样适用于客户端的反序列化。

这正是我最终要做的。我有一个服务定位器作为一个单点,在这里我可以捕获呼叫,但我希望在客户端有某种Jersey映射器可以轻松地实现这一点。过滤器也不好,我不能从中抛出异常。