我有以下ExceptionMapper,它应该捕获Resteasy抛出的所有ClientErrorException
@Provider
public class ClientErrorExceptionMapper implements ExceptionMapper<ClientErrorException> {
@Override
public Response toResponse(ClientErrorException exception) {
log.error("Error calling adapter. Response Status '{}' ", exception.getResponse().getStatus());
ErrorData error = ErrorData.builder()
.errorCode("error code")
.errorDescription("error description")
.build();
return Response
.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity(error)
.build();
}
}
具有一个充当代理的资源,并使用Resteasy将呼叫转发到另一个应用程序。
对schemeAdapterService.createPreCheckin()
的调用将始终返回404状态代码。
我尝试了以下示例:
@Path("/preCheckin")
@POST
public PreCheckinResponse preChecking(@Valid SomeData someData) {
PreCheckinResponse preCheckinResponse = schemeAdapterService.createPreCheckin(someData);
System.out.println("This is never printed");
return preCheckinResponse;
}
1。调用服务时,将抛出NotFoundException。但是,它不会输入ExceptionMapper,并直接返回404调用的响应。
@Path("/preCheckin")
@POST
public PreCheckinResponse preChecking(@Valid SomeData someData) {
PreCheckinResponse preCheckinResponse = null;
try {
preCheckinResponse = schemeAdapterService.createPreCheckin(someData);
} catch (ClientErrorException e) {
throw e;
}
System.out.println("This is never printed");
return preCheckinResponse;
}
2。在这里,它进入catch子句并重新引发异常,但它也没有输入ExceptionMapper。
@Path("/preCheckin")
@POST
public PreCheckinResponse preChecking(@Valid SomeData someData) {
PreCheckinResponse preCheckinResponse = null;
try {
preCheckinResponse = schemeAdapterService.createPreCheckin(someData);
} catch (ClientErrorException e) {
throw new NotFoundException(e.getResponse());
}
System.out.println("This is never printed");
return preCheckinResponse;
}
3。与2中的结果相同。
@Path("/preCheckin")
@POST
public PreCheckinResponse preChecking(@Valid SomeData someData) {
PreCheckinResponse preCheckinResponse = null;
try {
preCheckinResponse = schemeAdapterService.createPreCheckin(someData);
} catch (ClientErrorException e) {
throw new NotFoundException();
}
System.out.println("This is never printed");
return preCheckinResponse;
}
4。将new NotFoundException()
丢到这里将使异常正确地通过ExceptionMapper!
我不了解这种行为。我尝试在ClientErrorExceptionMapper
中注册ResteasyClient
和/或使用@Provided
。所有结果都相同。
我想使用1)中的示例,并将ExceptionMapper用于对schemeAdapterService的任何不成功的调用。