区分相同序列化对象的最简洁方法是什么?

时间:2018-04-18 00:17:14

标签: java serialization exception-handling jackson jax-rs

我有两个我的服务正在抛出的根异常类型

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)时,他们只会获得他们尝试读取的任何类的实例,因为它们具有相同的字段。

显然,我需要添加一些区分这两个对象的其他字段,但是如何以下列方式将其添加到构建器和构造函数中:

  • 不需要大量的客户逻辑,
  • 并不会使异常对象不必要地复杂化,而且
  • 可以被杰克逊理解吗?

1 个答案:

答案 0 :(得分:1)

要回答您的主要问题,您不希望客户端和服务器紧密耦合,让客户端使用服务器上使用的相同的Exception类,创建一个通用的错误bean并将异常映射到该bean序列化/反序列化。您可以使用javax.ws.rs.ext.ExceptionMapper以透明的方式执行此操作,此错误bean可以包含canRetryshouldRetry个字段。一个示例实现

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);;
    }
}