提问人:Денис Анд 提问时间:11/14/2023 最后编辑:Денис Анд 更新时间:11/17/2023 访问量:47
即使自定义异常映射器返回另一个异常,也会引发 ClientWebApplicationException
ClientWebApplicationException is thrown even if custom exception mapper returned another exception
问:
即使执行了异常映射器并在我捕获此异常时返回自定义异常,它始终是 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
答:
我认为抛出一个选中的异常更有用。
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 实现中可能存在错误。我不确定,您的解决方案对我来说看起来不错,但您可以尝试检查异常解决方案。也许它会更适合你。
评论