我有两个我的服务正在抛出的根异常类型
class ServiceException extends RuntimeException {
private Status status;
private String someString;
// Boilerplate omitted
}
class RetryableServiceException extends ServiceException {
// This class has no new fields
}
因为我们的客户端将使用一个通用的重试框架,它根据异常类确定是否重试。
但问题显然是,当客户端获得响应并调用Response.readEntity(Class <T> entityType)
时,他们只会获得他们尝试读取的任何类的实例,因为它们具有相同的字段。
显然,我需要添加一些区分这两个对象的其他字段,但是如何以下列方式将其添加到构建器和构造函数中:
答案 0 :(得分:1)
要回答您的主要问题,您不希望客户端和服务器紧密耦合,让客户端使用服务器上使用的相同的Exception类,创建一个通用的错误bean并将异常映射到该bean序列化/反序列化。您可以使用javax.ws.rs.ext.ExceptionMapper
以透明的方式执行此操作,此错误bean可以包含canRetry
或shouldRetry
个字段。一个示例实现
public class RetryableServiceExceptionMapper implements ExceptionMapper<RetryableServiceException> {
@Context
Request request;
public Response toResponse(RetryableServiceException exception) {
ApiError error = ApiError.builder().canRetry(true).message(exception.getMessage()).build();
return Response.status(status).cacheControl(cacheControl).tag(eTag).entity(error).type(APPLICATION_XML);;
}
}