代码之家  ›  专栏  ›  技术社区  ›  Daim

SpringMVC中的JDBC异常处理

  •  0
  • Daim  · 技术社区  · 6 年前

    我正在实现一个RESTAPI WebService,它从MySQL数据库中获取数据。它是书面的 here 我们不需要显式地处理数据库异常。我有个拦网 服务 层。我有以下问题。

    1-如何从catch块向相应的模型视图发送适当的错误消息?

    2-服务是捕获异常的正确层吗?

    我有以下代码

    控制器

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

    用户道

    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()); 
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   王瑞环    6 年前

    @dbreaux的答案是正确的。您应该自定义一个异常。

    public class UserException extends RuntimeException {
          // You can add some custom variables
          // such as error codes, error types, etc.
    }
    

    然后,您应该定义一个控制器建议来处理这个异常:

    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");
        }
    }
    
        2
  •  0
  •   dbreaux    6 年前

    您希望将特定于Web的行为与服务层和数据层隔离开来,我认为最好的方法是抛出一个新的、经过检查的、特定于域的行为。 Exception 这符合您想要在控制器中以不同方式处理的每个案例的含义。

    例如, DuplicateUserException ,请 SystemUnavailableException . 然后控制器捕获这些数据并将正确的案例添加到模型中。