英文:
Quarkus Microprofile Rest Client ResponseExceptionMapper doesn't catch errors
问题
我在一个 Quarkus (1.8.1) 服务中有一个 Rest Client,定义如下:
@RegisterRestClient
@Path("/")
@Produces("application/json")
@Consumes("application/json")
public interface MyClient {
@POST
@Path("/{entity}")
Response postEntity(@HeaderParam(value = "Authorization") String auth,
@PathParam("entity") String entity, Object payload) throws MyException;
}
我在同一个包中实现了 ResponseExceptionMapper
,代码如下:
public class MyExceptionMapper implements ResponseExceptionMapper<MyException> {
@Override
public MyException toThrowable(Response r) {
return new DynamicsException(r.getStatus() + " - " + r.readEntity(String.class));
}
}
当我调用服务时,它当前返回一个 404 错误,我预期会调用 MyExceptionMapper
类中的代码。然而事实并非如此,而是抛出了一个 javax.ws.rs.WebApplicationException
异常。堆栈跟踪中包括对 DefaultResponseExceptionMapper
的调用。似乎我的映射器未被注册。
我该如何注册用于处理调用服务时无效响应的处理程序?
英文:
I have a Rest Client in a Quarkus (1.8.1) service defined like this:
@RegisterRestClient
@Path("/")
@Produces("application/json")
@Consumes("application/json")
public interface MyClient {
@POST
@Path("/{entity}")
Response postEntity(@HeaderParam(value = "Authorization") String auth,
@PathParam("entity") String entity, Object payload) throws MyException;
}
And I have implemented ResponseExceptionMapper
in the same package like this:
public class MyExceptionMapper implements ResponseExceptionMapper<MyException> {
@Override
public MyException toThrowable(Response r) {
return new DynamicsException(r.getStatus() + " - " + r.readEntity(String.class));
}
}
When I call the service it is currently returning a 404 error, and I expected the code in the MyExceptionMapper
class to be called. However it doesn't and instead a javax.ws.rs.WebApplicationException
is thrown. The stack trace includes a call to the DefaultResponseExceptionMapper
. It's seems that my mapper has not been registered.
How can I register my handler for invalid responses from calls to the service?
答案1
得分: 7
@RegisterRestClient
@RegisterProvider(MyExceptionMapper.class)
@Path("/")
@Produces("application/json")
@Consumes("application/json")
public interface MyClient {
英文:
You need to register MyExceptionMapper as provider to the rest client with @RegisterProvider(MyExceptionMapper.class)
.
@RegisterRestClient
@RegisterProvider(MyExceptionMapper.class)
@Path("/")
@Produces("application/json")
@Consumes("application/json")
public interface MyClient {
答案2
得分: 2
每个实现都提供了一个默认的ResponseExceptionMapper实现,当响应状态码大于等于400时,它将映射并调用javax.ws.rs.WebApplicationException的响应。它的优先级为Integer.MAX_VALUE,意味着在遇到错误时应作为备用使用。这个映射器将默认注册到所有客户端接口,但可以通过设置一个MP配置属性microprofile.rest.client.disable.default.mapper为true来禁用它。
RestClientBuilder.newBuilder().property("microprofile.rest.client.disable.default.mapper", true)
英文:
Each implementation provides a default ResponseExceptionMapper implementation that will map and invoke a response to javax.ws.rs.WebApplicationException when the response status code is >= 400. It has a priority of Integer.MAX_VALUE, and is meant to be
used as a fallback whenever an error is encountered. This mapper will be registered bydefault to all client interfaces, but this can be disabled by setting an MP Config property,
microprofile.rest.client.disable.default.mapper, to true.
RestClientBuilder.newBuilder().property("microprofile.rest.client.disable.default.mapper",true)
答案3
得分: 0
为您提供默认实现:
@ClientExceptionMapper
static RuntimeException toException(Response response) {
if (response.getStatus() > 200) {
return new RuntimeException(response.readEntity(String.class));
}
return null;
}
英文:
It provides default implementation:
@ClientExceptionMapper
static RuntimeException toException(Response response) {
if (response.getStatus() > 200) {
return new RuntimeException(response.readEntity(String.class));
}
return null;
}
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论