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映射器可以轻松地实现这一点。过滤器也不好,我不能从中抛出异常。