病理特徵: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