我有一个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));
}
}
这两个选项都提供了依赖性删除。
我该如何解决这个问题?
答案 0 :(得分:0)
您的第一次尝试无效,因为只能为单个请求调用一个异常映射器。这是一个安全功能,可确保我们不会遇到无限循环。想象一下,XExceptionMapper
会在处理期间抛出YException
,YExceptionMapper
会在处理过程中抛出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);
}
});
}
}
然后你就可以注射它了。