Jersey ExceptionMapper依赖于另一个ExceptionMapper

时间:2017-05-04 18:40:29

标签: java jersey exceptionmapper

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

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

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

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

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

[1]在GenericException中抛出SomeAdHocExceptionMapper

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

这两个选项都提供了依赖性删除。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的第一次尝试无效,因为只能为单个请求调用一个异常映射器。这是一个安全功能,可确保我们不会遇到无限循环。想象一下,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);
            }
        });
    }
}

然后你就可以注射它了。