Java SpringMVC中的JDBC异常处理
我正在实现一个RESTAPI Web服务,它从MySql数据库获取数据。我们不需要显式地处理数据库异常。我在服务层中有捕获块。我有以下问题 1-如何从catch块向相应的模型视图发送适当的错误消息 2-服务层是否是捕获异常的正确层 我有以下代码 控制器Java SpringMVC中的JDBC异常处理,java,spring,rest,spring-mvc,spring-jdbc,Java,Spring,Rest,Spring Mvc,Spring Jdbc,我正在实现一个RESTAPI Web服务,它从MySql数据库获取数据。我们不需要显式地处理数据库异常。我在服务层中有捕获块。我有以下问题 1-如何从catch块向相应的模型视图发送适当的错误消息 2-服务层是否是捕获异常的正确层 我有以下代码 控制器 @RequestMapping(value = "/saveUser", method = RequestMethod.POST) public ModelAndView saveUser(@ModelAttribute User
@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"
}
}
UserDAO
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());
}
}
您希望将特定于web的行为与服务层和数据层隔离开来,我认为最好的方法是抛出一个新的、已检查的、特定于域的
异常,该异常与您希望在控制器中以不同方式处理的每个案例的含义相匹配
例如,DuplicateUserException
,SystemUnavailableException
。然后控制器捕获这些行为并将正确的案例添加到模型中。您希望将特定于web的行为与服务层和数据层隔离开来,我认为最好的方法是抛出一个新的、选中的,特定于域的异常
,与您希望在控制器中以不同方式处理的每个案例的含义相匹配
例如,DuplicateUserException
,SystemUnavailableException
。然后控制器捕获这些数据并将正确的大小写添加到模型中。@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");
}
}
@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");
}
}
您是否打算通过将适当的错误消息发送到相应的模型视图
,在JSP页面中显示错误消息?是否打算通过将适当的错误消息发送到相应的模型视图
,在JSP页面中显示错误消息?