Обработка исключений JDBC в Spring-mvc - PullRequest
0 голосов
/ 22 ноября 2018

Я реализую веб-сервис API REST, который извлекает данные из базы данных MySql.Здесь здесь написано, что нам не нужно явно обрабатывать исключение из базы данных.У меня есть блоки catch в слое Service .У меня есть следующие вопросы.

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

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()); 
    }
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

@ 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");
    }
}
0 голосов
/ 22 ноября 2018

Вы хотите изолировать поведение, специфичное для сети, от уровня обслуживания и от уровня данных, и я думаю, что лучший способ сделать это - создать новый проверенный, специфичный для домена Exception, который соответствует значениюкаждого случая вы хотите обрабатывать по-разному в контроллере.

Например, DuplicateUserException, SystemUnavailableException.Затем Контроллер ловит их и добавляет в Модель правильный регистр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...