我了解基于 Jersey 的 Web 服务能够将服务方法引发的异常与所需的 HTTP 返回代码相关联(此处)。现在,是否有机会让客户端生成与服务方法生成的完全相同的异常?我的意思是,如果服务器端抛出 MySpecificException,有没有办法在 HTTP 响应中存储这些信息(即异常类的 FQN)(自动地,我不想转向显式构建响应的方法,我希望他们返回 POJO 或 void),以便客户端可以使用它重新抛出相同的异常?
问问题
1433 次
1 回答
1
REST 没有将异常指定为响应,因此没有直接的方法可以做到这一点(这不是 RPC)。
但是,您可以引入自己的约定。例如:
在提供者方面,您可以定义ForbiddenException
:
public class ForbiddenException extends WebApplicationException {
public ForbiddenException(String code, String readableMessage) {
super(Response.status(Status.FORBIDDEN).entity(new ForbiddenEntity(code, readableMessage)).build());
}
}
(您可能应该在 ExceptionMapper 而不是异常本身中编写响应,但这仅用于演示目的)。
而在消费者方面 - ClientFilter
:
public class ForbiddenExceptionClientFilter extends ClientFilter {
@Override
public ClientResponse handle(ClientRequest cr) throws ClientHandlerException {
ClientResponse response = getNext().handle(cr);
if (response.getStatus() == Status.FORBIDDEN.getStatusCode()) {
ForbiddenEntity reason = response.getEntity(ForbiddenEntity.class);
throw new RemoteResourceForbiddenException(reason.getCode(), reason.getReadableMessage());
}
return response;
}
}
只要服务器符合约定并且客户端使用客户端过滤器,这就会起作用。
请注意,这不是“完全相同”的异常——堆栈跟踪没有被传输,但是这是正确的做法,因为它在客户端应用程序中没有任何意义。如果您需要堆栈跟踪 - 它应该ExceptionMapper
在服务器端使用打印到日志中。
于 2013-09-10T10:20:38.167 回答