0

Controllerクラスに次のコードがあり、何らかの理由で例外処理とtry ..... catchブロックが実装されていますが、それでも例外をキャプチャできません。

テストを実行しているところです。DAOクラスで、データベースに挿入するSQL文字列を変更して、DAOが失敗するように列を省略します。DAOクラスは失敗し、エラーはログに書き込まれますが、officerManager.RegisterOfficer(officer)が成功しなかった場合でも、コードはmodel.addAttribute( "results"、 "Record Was Saved")を返します。

これは正確ではないので、コントローラーにエラーをスローさせたいと思います。下はコードです。

コントローラ

@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);
    }       
}
4

1 に答える 1

1

エラーがコントローラーに戻ってくるのを許可していません。

DAO内で例外を処理しています。この場合、メソッドは正常に終了し、コントローラー内で例外がキャッチされることはありません。

DAOをtrycatchで囲んで例外をコントローラーにバブルバックさせるか(推奨)、例外をキャッチして再スローします(このルートに従う場合は、RuntimeExceptionとしてスローするか、独自に作成するか、次のように再スローします。 RuntimeExceptionを使用すると、コールスタック全体をキャッチする必要がなくなります。)

また、ログを調べない限り、原因を正確に特定するのは難しいため、一般的な例外をキャッチすることは一般的に嫌われています。通常、事前に処理する例外を把握しておくことをお勧めします。

于 2012-10-16T01:47:13.763 に答える