Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC中的JDBC异常处理_Java_Spring_Rest_Spring Mvc_Spring Jdbc - Fatal编程技术网

Java SpringMVC中的JDBC异常处理

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

我正在实现一个RESTAPI Web服务,它从MySql数据库获取数据。我们不需要显式地处理数据库异常。我在服务层中有捕获块。我有以下问题

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"
    }
}
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页面中显示错误消息?