1

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

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

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

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

我想将其转换SomeAdHocExceptionGenericException并让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));
    }
}

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

我该如何解决这个问题?

4

1 回答 1

0

您的第一次尝试将不起作用,因为单个请求只能调用一个异常映射器。这是一项安全功能,可确保我们不会陷入无限循环。想象一下在处理过程中抛出XExceptionMapper一个,在处理过程中抛出一个。YExceptionYExceptionMapperXException

您的第二次尝试将不起作用,因为映射器不可注入。你可以只是实例化它。

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

然后你就可以注入它了。

于 2017-05-04T20:04:49.140 回答