java - Jersey ExceptionMapper,依赖另一个ExceptionMapper

标签 java jersey exceptionmapper

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

@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 注入(inject) SomeAdHocExceptionMapper:

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

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

两个选项都给出依赖项异常(exception)。

如何解决这个问题?

最佳答案

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

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

@Provider
public class SomeAdHocExceptionMapper implements ExceptionMapper<SomeAdHocException> {

    private final GenericExceptionMapper mapper = new GenericExceptionMapper();

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

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

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

然后你就可以注入(inject)它了。

关于java - Jersey ExceptionMapper,依赖另一个ExceptionMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43790473/

相关文章:

java - Jersey 错误地调用子资源

java - 如何优先考虑 CDI 拦截器而不是 JAX-RS ExceptionMapper

java - JAX-RS( Jersey 实现)ExceptionMapper<Throwable> 未捕获 ConstraintViolationException

java - Jersey - 请求的资源(未找到)不可用

spring - NoSuchMethodError : com. sun.jersey.core.reflection.ReflectionHelper.getOsgiRegistryInstance()Lcom/sun/jersey/core/osgi/OsgiRegistry;

java - 在java中提取没有对象的JSON内容

java - 如何在Java Spring Boot中从请求 header 获取承载 token ?

java - 使用JAVA将QueryString转换为Json

java - 如何对 Map<String, List<CustomObject>> 进行排序?

java - 如何在 Azure 的 Spring Cloud Functions 中 Autowiring 我的 Bean?