即使自定义异常映射器返回另一个异常,也会引发 ClientWebApplicationException

ClientWebApplicationException is thrown even if custom exception mapper returned another exception

提问人:Денис Анд 提问时间:11/14/2023 最后编辑:Денис Анд 更新时间:11/17/2023 访问量:47

问:

即使执行了异常映射器并在我捕获此异常时返回自定义异常,它始终是 ClienWebApplicationException。

因此,如果我使用 rest 客户端进行调用,并且客户端返回不成功的响应,则此响应将通过调用我的 ResponseExceptionMapper 映射到我的自定义异常。

在异常映射器返回我的自定义异常后,我尝试在代码中捕获它,但我没有得到我的异常实例,而是得到了 ClienWebApplicationException,而 ClienWebApplicationException 的原因是我的自定义异常。

在Quarkus中,我有rest客户端

@RegisterProvider(IdentityResponseExceptionMapper.class)
@RegisterRestClient(configKey = "identity-api")
public interface IdentityTenantsClient {
    @POST
    @Path("/internal/tenants")
    TenantResponseDTO createTenant(TenantRequestDTO body);

响应异常映射器

public class IdentityResponseExceptionMapper implements ResponseExceptionMapper<IdentityResponseException> {
    @Override
    public IdentityResponseException toThrowable(Response response) {
        ProblemDetail problemDetail = response.readEntity(ProblemDetail.class);
        return new IdentityResponseException(problemDetail, response);
    }
}

@RegisterForReflection
public class IdentityResponseException extends WebApplicationException {
    @Getter
    private final transient ProblemDetail problemDetail;

    public IdentityResponseException(ProblemDetail problemDetail, Response response) {
        super(problemDetail.getDetail(), response);
        this.problemDetail = problemDetail;
    }

出于某种原因,无论异常处理程序将响应映射到 IdentityResponseException,方法内部的捕获都会捕获 ClientWebApplicationException 而不是 ClientWebApplicationException

java 异常 quarkus

评论


答:

0赞 CodingSamples 11/17/2023 #1

我认为抛出一个选中的异常更有用。

public class IdentityResponseException extends Exception {

    @Getter
    private final ProblemDetail problemDetail;

    @Getter
    private final Response response;

    public IdentityResponseException(ProblemDetail problemDetail, Response response) {
        super(problemDetail.getDetail());
        this.problemDetail = problemDetail;
        this.response = response;
    }
}
@RegisterProvider(IdentityResponseExceptionMapper.class)
@RegisterRestClient(configKey = "identity-api")
public interface IdentityTenantsClient {
    @POST
    @Path("/internal/tenants")
    TenantResponseDTO createTenant(TenantRequestDTO body) throws IdentityResponseException;

从 microprofile rest 客户端规范 (https://download.eclipse.org/microprofile/microprofile-rest-client-2.0/microprofile-rest-client-spec-2.0.html#_how_to_implement_responseexceptionmapper) 来看,您是对的。应直接抛出异常。当抛出的异常是 WebApplicationException 的实例时,resteasy 实现中可能存在错误。我不确定,您的解决方案对我来说看起来不错,但您可以尝试检查异常解决方案。也许它会更适合你。