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
在处理过程中抛出一个 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);
}
});
}
}
那你就可以注射了
我有一个 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
在处理过程中抛出一个 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);
}
});
}
}
那你就可以注射了