Jersey ExceptionMapper,依赖另一个ExceptionMapper

Jersey ExceptionMapper, rely on another ExceptionMapper

我有一个 ExceptionMapper,它是通用公共库的一部分:

@Provider
public class GenericExceptionMapper implements ExceptionMapper<GenericException> {
    ...
}

现在,在我的具体项目中,我有自己的 ExceptionMapper:

@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {
    ...
}

我想将 SomeAdHocException 转换为 GenericException 并让 GenericExceptionMapper 负责进一步处理。我尝试了以下两个选项,但都不起作用:

[1] 在 SomeAdHocExceptionMapper 中抛出 GenericException:

@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {
    public Response toResponse(SomeAdHocException e) {
        throw new GenericException(e);
    }
}

[2] 将 GenericExceptionMapper 注入 SomeAdHocExceptionMapper:

@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {
    @Inject
    private GenericExceptionMapper mapper;

    public Response toResponse(SomeAdHocException e) {
        return mapper.toResponse(new GenericException(e));
    }
}

两个选项都给出了依赖性异常。

我该如何解决这个问题?

您的第一次尝试不会成功,因为单个请求只能调用 一个 异常映射器。这是一项安全功能,可确保我们不会 运行 陷入无限循环。假设 XExceptionMapper 在处理过程中抛出一个 YExceptionYExceptionMapper 在处理过程中抛出一个 XException

您的第二次尝试将失败,因为映射器不可注入。不过,您 可以 直接实例化它。

@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {

    private final GenericExceptionMapper mapper = new GenericExceptionMapper();

    public Response toResponse(SomeAdHocException e) {
        return mapper.toResponse(new GenericException(e));
    }
}

假设有这样一个构造函数并且通用映射器不需要任何它自己的注入。如果是这样,您可以使映射器可注入。

public class AppConfig extends ResourceConfig {
    public AppConfig() {
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bindAsContract(GenericExceptionMapper.class);
            }
        });
    }
}

那你就可以注射了