Spring MVC的@RequestMapping註解的方法簽名異常

病理特徵:Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature java

    堆棧信息:忘了^_^...web

    自從使用Spring框架之後,筆者再也沒有用EJB了,固然更不會用落後的Struts。Spring與Struts爲兩種不一樣功能的框架,沒有可比 性,但Spring框架中有個子模塊Spring MVC與Struts功能是同樣的,若是項目中選用Spring來管理服務層,加上它有MVC模塊,何須再一套繁瑣的Struts呢?儘管Struts2 變得再也不那麼複雜。spring

    Spring MVC自2.5版以來,全面支持@MVC,筆者每天作程序,曾經較長一段時間沒有與xml文件打過交道,Spring 的@MVC的確靈活高效,以至愛不釋手。瀏覽器

    咱們知道,當Spring MVC基礎配置好後,瀏覽器發來的每一個請求均可以經過@RequestMapping映射到方法上,例如發佈一篇文章:app

 

@Controller 
public class ArticleAction{

    @Resource protected GenericService service;

    @RequestMapping(value="/inputArticle",method=RequestMethod.GET)
    public String editAttribute(HttpServletRequest request){

          request.setAttribute("article", new Article);
          return "編輯界面";

    }

    @RequestMapping(value="/inputArticle",method=RequestMethod.POST)
    public String saveArticle(@ModelAttribute("article") Article article, BindingResult result, ModelMap model, HttpServletRequest request){ 

        try {

            new ArticleValidator().validate(article, result, request);
            if(result.hasErrors()){
                throw new RuntimeException("驗證未經過,請查檢數據是否合法!");
            }
            service.save(article);

        } catch (Exception e) {
            result.reject("id", null, e.getMessage());//原來校驗的錯誤信息也在result對象中,另加上Exception對象中的消息
            return "編輯界面";
        }

        return "成功頁面";

    }

}

    這是一個典型的Pojo,沒有任何繼承與接口,經過@Controller和@RequestMapping就使這個pojo變成了一個強大的web控制 器,第一個方法是不瀏覽器發來GET請求,則進入編輯文章的界面,第二方法是當瀏覽器發來POST請求,請執行文章保存。這是新添加文章,但修改文章也是 如此,所以咱們不必再作重複的方法,只要在方法簽名中增長一個id綁定就能夠,若是id爲空,就是新增,若是有值就是修改,那麼第二個方法修改以下:框架

 public String saveArticle(@ModelAttribute("article") Article article, @RequestParam(value="id",required=false) Integer articleId, BindingResult result, ModelMap model, HttpServletRequest request){ }fetch

    這時個就會出現一個異常:Errors/BindingResult argument declared without preceding model attribute. Check your handler method signatureui

    我搜索中文有關這個異常的解決辦法(英文太菜了),答案有一個:解決方法是查看Controller的方法參數,去除BindingResult result參數便可。哈哈,典型的中國式醫學手術——哪一個器官壞了切掉哪一個器官,也無論人受不受得了,和上篇筆者關於JPA、Hibernate出現 「cannot simultaneously fetch multiple bags異常的解決」文章所提的同樣,不少同仁們就是禁掉實時加載。這樣都不能從根本上解決問題。code

    通過筆者研究讀代碼,發現BindingResult的對象必須與@ModelAttribute聲明的對象綁定,這種綁定是由Spring MVC來作,但若他們中間插入別的參數,則沒法綁定了,因此Errors/BindingResul類型的參數必須在標註@ModelAttribute 類型的參數次一位置(挨着),見 org.springframework.web.bind.annotation.support.HandlerMethodInvoker源代碼。xml

相關文章
相關標籤/搜索