2016-09-26 3 views
2

Это лучший способ захватить исключение весной mvc. Я не заканчиваю реализацию обработки исключений весной mvc.Обработка исключений весной mvc

Я внедрил @ControllerAdvice. Не могли бы вы подтвердить, правильно ли я применил это исключение.

Вопрос:

  1. Как обработать исключение службы слоя. Должен ли я бросать его на контроллер, а затем в пользовательский интерфейс? Как это работает.

  2. Как я могу обработать исключение sql в слое DAO и другие исключения, такие как исключение Numberformat?

Код:

@RequestMapping(value = "/getDepositSearch", method = RequestMethod.POST) 
public String depositNumberData(
     @ModelAttribute("searchCondition") String searchCondition, 
     @ModelAttribute("searchText") String searchText, 
     final RedirectAttributes redirect, Model depositStatus, 
     HttpServletRequest request) { 

    String pageForward = null; 

    try { 
     List<MRPSDeposit> depositDetails = null; 
     if (!searchText.isEmpty()) { 
      depositDetails = mrpsDeposit.getDepositDetails(searchCondition, 
        searchText); 
     } 
     Map<String, String> searchList = new LinkedHashMap<String, String>(); 

     if (searchCondition.equals(ManagementConstants.DEPOSITDATEKEY)) { 
      searchList.put(ManagementConstants.DEPOSITDATEKEY, 
        ManagementConstants.DEPOSITDATEVALUE); 
     } else if (searchCondition.equals(ManagementConstants.DEPOSITNUMBERKEY)) { 

      searchList.put(ManagementConstants.DEPOSITNUMBERKEY, 
        ManagementConstants.DEPOSITNUMBERVALUE); 
     } else { 
      searchList.put(ManagementConstants.DEPOSITNUMBERKEY, 
        ManagementConstants.DEPOSITNUMBERVALUE); 
      searchList.put(ManagementConstants.DEPOSITDATEKEY, 
        ManagementConstants.DEPOSITDATEVALUE); 

     } 

     if (depositDetails.size() == 0) { 
      redirect.addFlashAttribute("flashMessage", 
        ManagementConstants.NORECORDFOUND); 
      pageForward = "redirect:/mrps/getDepositDetails"; 
     } else if (depositDetails.size() > 1) { 

      Map<String, Map<String, String>> search = new HashMap<String, Map<String, String>>(); 
      search.put("searchContent", searchList); 
      depositStatus.addAttribute("searchAllContents", search); 
      depositStatus.addAttribute("depositDetails", depositDetails); 

      pageForward = "multipleDepositDetails"; 

     } else { 

      Map<String, Map<String, String>> search = new HashMap<String, Map<String, String>>(); 

      search.put("searchContent", searchList); 
      depositStatus.addAttribute("searchAllContents", search); 
      depositStatus.addAttribute("depositDetails", depositDetails); 
      if (request.isUserInRole("ROLE_READ")) { 
       pageForward = "readDepositDetails"; 
      } else { 
       pageForward = "updateDepositDetails"; 
      } 
     } 

    } catch (InfoManagementException e) { 
     System.out.println("weee"+e); 
    } 
    return pageForward; 

} 

Сервис слой:

@Override 
@Transactional(readOnly = true) 
public List<MRPSDeposit> getDepositDetails(String searchCondition, 
     String searchText) { 
    List<MRPSDeposit> mrpsDepositDetails = new ArrayList<MRPSDeposit>(); 
    /* try { */ 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", 
      Locale.ENGLISH); 
    if (searchCondition.equalsIgnoreCase(ManagementConstants.DEPOSITNUMBERKEY)) { 
     System.out.println("finalal"); 
     mrpsDepositDetails = mrpsDepositDao.findByDepositNumber(
       searchCondition, Short.valueOf(searchText)); 
    } else { 
     try { 
      mrpsDepositDetails = mrpsDepositDao.findByDepositDate(
        searchCondition, formatter.parse(searchText)); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    return mrpsDepositDetails; 

} 

DAO слой:

@Override 
public List<MRPSDeposit> findByDepositNumber(String searchCondition, 
     Short searchTxt) { 
    List<MRPSDeposit> searchResult = super.findByDepositNumber(
      searchCondition, searchTxt); 
    return searchResult; 
} 

Контроллер Совет:

@ControllerAdvice 
public class GlobalExceptionController { 

@ExceptionHandler(InfoManagementException.class) 
public ModelAndView handleCustomException(InfoManagementException ex) { 

    ModelAndView model = new ModelAndView("error/generic_error"); 
    System.out.println(); 
    model.addObject("errCode", ex.getErrCode()); 
    model.addObject("errMsg", ex.getErrMsg()); 

    return model; 

} 

@ExceptionHandler(Exception.class) 
public ModelAndView handleAllException(Exception ex) { 

    ModelAndView model = new ModelAndView("error/generic_error"); 
    model.addObject("errMsg", "this is Exception.class"); 

    return model; 

} 

}

+0

Любой может прокомментировать это – bharathi

ответ

0

Как я могу обработать исключение службы слоя. Должен ли я бросать его на контроллер , а затем в UI? Как это работает.

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

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

Как я могу справиться с SQL исключения в DAO слое и другие исключения, как NumberFormat исключение?

Я бы рекомендовал вам использовать проверку ввода в контроллере. Если вы его используете, то вы не получите такую ​​ошибку. Но если у вас нет проверки ввода, вы можете выбросить исключение и показать сообщение в пользовательском интерфейсе.

Update

Вы можете оставить свой слой сервиса, как у вас есть в данный момент и обработать исключение в ControllerAdvice. Если вы хотите обработать исключение на уровне сервиса, вы можете сделать это с помощью try/catch.

public void myServiceMethod(){ 
    try{ 
    ... 
    }catch(Exception1 e){//Every catch block can capture a group of exceptions. 
    //Depending on your business logic, you can throw a new Exception, log it,  or do some logic. 
    logger.log("My error: ", e); 
    }catch(Exception2 e){//Every catch block can capture a group of exceptions. 
    throw new MyBusinessException("Something ocurred", e); 
    } 
} 

Затем в вашем контроллереAdvice вам необходимо обработать MyBusinessException и выполнить то, что вам нужно.

+0

Могу ли я иметь пример для этой обработки исключений для уровня обслуживания. – bharathi

+0

@bharathi Я отредактировал ответ – reos

+0

Спасибо за помощь reos. – bharathi

Смежные вопросы