我正在使用Dropwizard(Jersey作为JAX-RS实现+ Jetty作为Web服务器)和Spring JdbcTemplate开发微服务。为了向我的API用户提供正确的响应,我正在尝试找出处理DAO层抛出的异常的最佳方法。
我有一些特别感兴趣的地方:
EmptyResultDataAccessException
。
我在DAO中捕获此异常ID并返回null
,它在API层中转换为状态代码为404 Not Found
的响应。
DataIntegrityViolationException
被抛出
或更新数据结果违反完整性约束。
我将它包装在我的自定义检查异常中并重新抛出catch子句。然后这个dao层异常被捕获在我的服务层中(并且在catch子句中再次抛出我的自定义服务层异常)。然后在我的API层中捕获服务层异常,记录它并返回带有409 Conflict
状态代码的响应。
DataAccessException
是所有JdbcTemplate(未经检查)异常的超类。我抓住了这个异常并包装了我的自定义异常(最后是在我的API层捕获)。然后我返回带有500 Internal Server Error
状态代码的回复。
通过这种方式,我想区分4xx和5xx错误。如果我没有捕获JdbcTemplate未经检查的异常,那么将冒泡到servlet,用户将始终收到500 Internal Server Error
,这是不好的。另一种方法是在我的API模块中使用ExceptionMapper<T>
接口的实现捕获所有JdbcTemplate异常。但在这种情况下,我将使用紧密耦合的代码,我的DAO层实现中的更改将导致API层的更改。
所以我的问题是 - 是否应该使用我所描述的方法?