在JAX-RS + Spring JdbcTemplate应用程序中处理异常的最佳方法

时间:2017-03-19 11:46:20

标签: jax-rs dropwizard jdbctemplate

我正在使用Dropwizard(Jersey作为JAX-RS实现+ Jetty作为Web服务器)和Spring JdbcTemplate开发微服务。为了向我的API用户提供正确的响应,我正在尝试找出处理DAO层抛出的异常的最佳方法。

我有一些特别感兴趣的地方:

    如果找不到具有给定id的实体,则由JdbcTemplate#queryForObject方法抛出
  • 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层的更改。

所以我的问题是 - 是否应该使用我所描述的方法?

0 个答案:

没有答案