Spring MVC Exceptions

时间:2012-10-16 01:23:18

标签: exception spring-mvc error-handling

我在控制器类中有以下代码,出于某种原因虽然我实现了异常处理以及 try ..... catch 块我是仍无法捕捉我的异常。

我正在执行一个测试,在 DAO 类中,我更改了插入数据库的sql字符串,只留下一列,以便 DAO 失败。 DAO 类失败并将错误写入日志,但即使 officerManager.RegisterOfficer(官员)未成功,代码也会继续返回模型.addAttribute(“结果”,“记录被保存”)。

这不准确,我希望控制器抛出错误。下面是代码。

控制器

@RequestMapping(value="officer_registration.htm", method=RequestMethod.POST)
public ModelAndView handleRequest(@Valid @ModelAttribute Officers officer,BindingResult result,ModelMap m,Model model,HttpServletRequest request,HttpServletResponse response)throws Exception{

         try{
             if(result.hasErrors()){

                 model.addAttribute("division", myDivision);
                 model.addAttribute("position", myPosition);
                 model.addAttribute("gender", myGender);
                 return new ModelAndView("officer_registration");

            }else{

                //check the request if its an update or an insert
                String user_request = request.getParameter("user_request");
                logger.info("The Users Request Was " + user_request);

                if (user_request.equals("Save")){

                        officerManager.RegisterOfficer(officer);
                        model.addAttribute("results","Record Was Saved");

                }else{

                    officerManager.UpdateOfficer(officer);
                    model.addAttribute("results","Record Was Updated");
                }

                 model.addAttribute("division", myDivision);
                 model.addAttribute("position", myPosition);
                 model.addAttribute("gender", myGender);            
                return new ModelAndView("officer_registration");
            }   


         }catch(Exception e ){
             model.addAttribute("division", myDivision);
             model.addAttribute("position", myPosition);
             model.addAttribute("gender", myGender);
             model.addAttribute("results","Error: Unable to Save Record!");
             return new ModelAndView("officer_registration");
         }



     }

DAO

public void saveOfficer(Officers officer) {
    logger.info("In saveOfficer");


    //SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    try{

        int count = getJdbcTemplate().update("INSERT INTO crimetrack.tblofficers (userName,password, fName, lName, oName, divisionNo, positionId, emailAdd, startDate, endDate, genderId,phoneNo, dob,badgeNo) "+
                                            "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
                                            , new Object[]{officer.getUserName(),StringSecurity.EncryptString(officer.getPassword()),officer.getfName(),
                                             officer.getlName(),officer.getoName(),officer.getDivisionNo(),officer.getPositionId(),
                                             officer.getEmailAdd(),officer.getStartDate(),officer.getEndDate(),officer.getGenderId(),
                                             officer.getPhoneNo(),officer.getDob(),officer.getBadgeNo()});

    logger.info(count +" Rows affected in tblOfficers");



    }catch(Exception e){

        logger.error("Could not save officer ", e);
    }       
}

1 个答案:

答案 0 :(得分:1)

您不允许错误冒泡回到控制器。

您正在处理DAO中的异常,在这种情况下,该方法正常退出,并且Controller中没有捕获异常。

要么不用try catch包围DAO并让异常气泡回到控制器(推荐),要么捕获并重新抛出异常(如果你按照这个路径,抛出一个RuntimeException,或者创建你自己的,或者作为RuntimeException重新抛出,这样你就不必一直捕获调用堆栈。)

此外,它通常不赞成捕获一般异常,因为除非你在日志中查看,否则更难确定导致它的原因。知道提前处理哪些例外通常是更好的做法。