RestTemplate:从ResponseErrorHandler抛出的自定义异常不是传播给调用者

时间:2017-01-27 01:45:20

标签: java spring exception exception-handling resttemplate

我正在开发一个API。按照Clean Code和其他简洁的编程指南,我不想用try / catch块来混淆我的代码。但是我面临一个挑战:从ResponseErrorHandler抛出的自定义异常不会传播给调用者;相反,它是调用者收到的ResourceAccessException。

这是我的API代码(为简洁起见省略了不敬的部分)。注意我不是在try块中调用restTemplate.delete() - 这是故意的:

restTemplate.setErrorHandler(ecmResponseErrorHandler);
restTemplate.delete(serviceUrl, params);

我的ecmResponseErrorHandler代码(为简洁起见省略了不敬的部分):

public class ECMResponseErrorHandler implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        if (response.getStatusCode() != HttpStatus.OK) {
            //logging etc.
            return true;
        }
        return false;
    }

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
       //appropriately populate ECMException() and then throw it
       throw new ECMException();
    }
}

我的ECMException是(为了简洁省略了不敬的部分):

public class ECMException extends IOException {

    public ECMException() {
        super();
    }
    //etc.

 }

现在,我的JUnit测试用例收到ResourceAccessException,而不是接收ECMException:

java.lang.Exception: Unexpected exception, expected<com.db.dbbpm.ecmfacade.exception.ECMException> but was<org.springframework.web.client.ResourceAccessException>

如果我将API代码更改为以下内容,一切正常;但是我不想用try / catch块来混淆我的API代码:

restTemplate.setErrorHandler(ecmResponseErrorHandler);
try {
    restTemplate.delete(serviceUrl, params);
} catch () {
    throw new ECMException();
}

为什么从ResponseErrorHandler抛出的ECMException不会一直传播到调用者?我该如何实现?

1 个答案:

答案 0 :(得分:1)

使ECMException扩展RuntimeException(而不是IOException)解决了这个问题。现在我的代码更清晰了。

public class ECMException extends RuntimeException {

    public ECMException() {
        super();
    }
    //etc.
}