java - Spring-mvc 中的 JDBC 异常处理
问题描述
我正在实现一个 REST api Web 服务,它从 MySql 数据库中获取数据。这里写的是我们不需要显式处理数据库异常。我在服务层中有 catch 块。我有以下问题。
1-如何从 catch 块向相应的模型视图发送适当的错误消息?
2- Service 是捕获异常的正确层吗?
我有以下代码
控制器
@RequestMapping(value = "/saveUser", method = RequestMethod.POST)
public ModelAndView saveUser(@ModelAttribute User user, BindingResult result)
{
ModelAndView mv = new ModelAndView();
validator.validate(user, result);
if(result.hasErrors()) {
mv.setViewName("addUser");
}
else {
service.saveUser(user);
mv.setViewName("redirect:/users/listAllUsers");
}
return mv;
}
服务
public void saveUser(User user) {
try {
userDao.saveUser(user);
} catch(DuplicateKeyException e) {
//Here i want to send "User already exist"
} catch(DataAccessException e) {
//Here i want to send "Databae unreachable"
}
}
用户DAO
public void saveUser(User user) {
String sql = "INSERT INTO User (fname, lname, address, phone)"
+ " VALUES (?, ?, ?, ?)";
jdbcTemplate.update(sql, user.getFname(), user.getLname(),
user.getAddress(), user.getPhone());
}
}
解决方案
@dbreaux 的答案是正确的。您应该自定义一个异常。
public class UserException extends RuntimeException {
// You can add some custom variables
// such as error codes, error types, etc.
}
然后,你应该定义一个 ControllerAdvice 来处理这个异常:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class UserControllerAdvice{
@ExceptionHandler(value = UserException.class)
public ModelAndView handleUserException(UserException ex){
// Generate corresponding results(ModelAndView) based on exception.
// example: Put the error message to model.
return new ModelAndView("prompt_page",ex.getMessage());
}
}
最后,你可以抛出UserException
你的服务。
public void saveUser(User user) {
try {
userDao.saveUser(user);
} catch(DuplicateKeyException e) {
throw new UserException("User already exist");
} catch(DataAccessException e) {
throw new UserException("Databae unreachable");
}
}
推荐阅读
- c - C中的类型转换是香蕉?
- gradle - 在 Gradle 中,可以从 Groovy 方法中获取调用项目或任务吗?
- python - 未定义的变量“资源”
- c# - 阻止对特定域 CefSharp 的请求
- reactjs - 使用 rowEvents react-bootstrap-table 修改一行单元格的样式
- openiddict - 除了使用 OpenIddict 的 OpenId 之外,还允许 Basic 授权
- sas - 在 SAS Enterprise Guide 8.1 上打开 SAS 表后文件树消失
- javascript - 如何在 postgresql & express 中的其他占位符变量中插入日期范围?
- ubuntu - “无法初始化 NVML:驱动程序/库版本不匹配”- Ubuntu 服务器是否自动更新?
- bootstrap-4 - 如何仅将中心导航栏与 bootstrap 4.5.3 对齐?