1

我了解基于 Jersey 的 Web 服务能够将服务方法引发的异常与所需的 HTTP 返回代码相关联(此处)。现在,是否有机会让客户端生成与服务方法生成的完全相同的异常?我的意思是,如果服务器端抛出 MySpecificException,有没有办法在 HTTP 响应中存储这些信息(即异常类的 FQN)(自动地,我不想转向显式构建响应的方法,我希望他们返回 POJO 或 void),以便客户端可以使用它重新抛出相同的异常?

4

1 回答 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 回答