Resteasy引发ExceptionMapper未捕获的异常

时间:2019-02-15 10:05:41

标签: java wildfly resteasy

我有以下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的任何不成功的调用。

0 个答案:

没有答案