Friday 1 November 2013

Java: @ModelAttribute

Masalah: properties yang tiada element pada .jsp disetkan sebagai null.


Cara mengatasinya adalah menggunakan @ModelAttribute di mana ada 2 jenis yang boleh disemak pada docs spring-framework.

@ModelAttribute pada function akan dipanggil pabila sesuatu model yang serupa pada parameter ditemui.

UPDATE! walaupun tanpa @ModelAttribute("studyLeaveSupervisor") di hadapan StudyLeaveSupervisor dalam parameter @RequestMapping, function pada @ModelAttribute tetap dipanggil.

Jadi kita boleh gunakan function ini untuk dapatkan data daripada DB contohnya. Kemudian data ini akan di-override oleh value pada page.

@ModelAttribute
      /**  
       * Init data daripada DB ke dalam model sebelum di-override oleh data daripada form apabila jumpa parameter yang declared  
       * sebagai <code>@ModelAttribute("studyLeaveSupervisor") </code>. Ini adalah untuk elakkan field yang tiada dalam form di-set value-nya kepada null.  
       * ModelAttribute akan dipanggil sebelum mana-mana RequestMapping yang berkaitan.  
       * @param p2 nama field dalam page  
       * @param slsStudyleaveRefcode nama field dalam page  
       * @param slsSupervisorId nama field dalam page  
       * @return  
       */  
      @ModelAttribute("studyLeaveSupervisor")  
      public StudyLeaveSupervisor preloadStudyLeaveSupervisor( String p2, String slsStudyleaveRefcode, String slsSupervisorId) {  
         if( !StringUtil.isEmpty(slsStudyleaveRefcode) && !StringUtil.isEmpty(p2) && !StringUtil.isEmpty(slsSupervisorId) )  
         {  
                 StudyLeaveSupervisorKey key = new StudyLeaveSupervisorKey();  
                key.setSlsStartDate( DateUtil.parseYYYYMMDDDate( p2 ) );  
                key.setSlsStudyleaveRefcode(slsStudyleaveRefcode);  
                key.setSlsSupervisorId(slsSupervisorId);  
                System.out.println("\t>> loadStudyLeaveSupervisor = " + key.toString() );  
                return studyLeaveService.getSupervisorById(key);  
         }  
         else{  
              return new StudyLeaveSupervisor();  
         }  
      }  

@RequestMapping

      @RequestMapping(method = RequestMethod.PUT)  
      public String update(@ModelAttribute("studyLeaveSupervisor") @Valid StudyLeaveSupervisor studyLeaveSupervisor,   
                BindingResult bindingResult, Model uiModel, HttpServletRequest request, HttpSession session)   
      {  
           MessageObject msj = new MessageObject();  
           try{  
                if (studyLeaveSupervisor != null){  
                     studyLeaveSupervisor.setSlsUpdateDate( new Date() );  
                     studyLeaveSupervisor.setSlsUpdateBy( StringUtil.getString( session.getAttribute( SystemConstant.VAR_SESSION_USERID ) ) );  
                     logger.debug("\tupdate: \tsupervisor = " + studyLeaveSupervisor.toString());  
                     studyLeaveService.updateStudyLeaveSupervisor(studyLeaveSupervisor);  
                }  
                msj = new MessageObject(false, "Successfully update record.", null, studyLeaveSupervisor.getSlsSupervisorId());  
           }catch(Exception e){  
                msj = new MessageObject(true, "Fail to update record.", e.getMessage(), studyLeaveSupervisor.getSlsSupervisorId());  
                e.printStackTrace();  
                uiModel.addAttribute( ViewVariables.VAR_MSJ_GENERIC, msj);  
                return ADD_EDIT_PAGE_URL;  
           }  
           uiModel.addAttribute( ViewVariables.VAR_MSJ_GENERIC, msj);  
           return "redirect:"+LIST_FULLMAPPING;  
      }