首页 > 解决方案 > 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()); 
    }
}

标签: javaspringrestspring-mvcspring-jdbc

解决方案


@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");
    }
}

推荐阅读