文档章节

Spring MVC的@RequestMapping注解的方法签名异常

李长春
 李长春
发布于 2011/09/15 16:47
字数 778
阅读 1544
收藏 2

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

    堆栈信息:忘了^_^...

    自从使用Spring框架以后,笔者再也没有用EJB了,当然更不会用落后的Struts。Spring与Struts为两种不同功能的框架,没有可比 性,但Spring框架中有个子模块Spring MVC与Struts功能是一样的,如果项目中选用Spring来管理服务层,加上它有MVC模块,何必再一套繁琐的Struts呢?尽管Struts2 变得不再那么复杂。

    Spring MVC自2.5版以来,全面支持@MVC,笔者天天做程序,曾经较长一段时间没有与xml文件打过交道,Spring 的@MVC的确灵活高效,以致爱不释手。

    我们知道,当Spring MVC基础配置好后,浏览器发来的每个请求都可以通过@RequestMapping映射到方法上,例如发布一篇文章:

 

@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){ }

    这时个就会出现一个异常:Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature

    我搜索中文有关这个异常的解决办法(英文太菜了),答案有一个:解决方法是查看Controller的方法参数,去除BindingResult result参数即可。哈哈,典型的中国式医学手术——哪个器官坏了切掉哪个器官,也不管人受不受得了,和上篇笔者关于JPA、Hibernate出现 “cannot simultaneously fetch multiple bags异常的解决”文章所提的一样,很多同仁们就是禁掉实时加载。这样都不能从根本上解决问题。

    经过笔者研究读代码,发现BindingResult的对象必须与@ModelAttribute声明的对象绑定,这种绑定是由Spring MVC来做,但若他们中间插入别的参数,则无法绑定了,所以Errors/BindingResul类型的参数必须在标注@ModelAttribute 类型的参数次一位置(挨着),见 org.springframework.web.bind.annotation.support.HandlerMethodInvoker源代码。

© 著作权归作者所有

共有 人打赏支持
李长春
粉丝 82
博文 249
码字总数 117406
作品 0
海淀
私信 提问
加载中

评论(1)

ardorleo
ardorleo
西医才是哪痛切哪儿!兄弟不用太宠着西医
SpringMVC 基于注解的Controller @RequestMapping @Request

概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能。现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和 Controller...

蓝狐乐队
2014/02/28
0
1
超详细 Spring @RequestMapping 注解使用技巧

@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。 在这篇文章中,你将会看到 @RequestMapping 注解在被用来...

oschina
2017/09/13
7.9K
9
SpringMVC基于注解的Controller

本文将介绍 Spring 2.5 新增的 Sping MVC 注解功能,讲述如何使用注解配置替换传统的基于 XML 的 Spring MVC 配置。 一个简单的基于注解的 Controller 使用过低版本 Spring MVC 的读者都知道...

黎嘉诚
2016/08/21
29
0
spring mvc 统一异常处理

1、定义一个统一异常处理类 @ControllerAdvice,是spring3.2提供的新注解, 一般扫描context:component-scan扫描时也能扫描到,不需要在配置文件配置 但如果你的spring-mvc配置文件使用如下方...

qiun
2016/06/24
308
0
Spring MVC 解读——

Spring MVC 解读——mvc:annotation-driven/ 一、AnnotationDrivenBeanDefinitionParser 通常如果我们希望通过注解的方式来进行Spring MVC开发,我们都会在***-servlet.xml中加入mvc:annotat...

麦壳原野
2014/03/05
0
8

没有更多内容

加载失败,请刷新页面

加载更多

大数据学习有哪几个步骤

目前大数据行业异常火爆,不少人都对大数据充满了兴趣,其中有大部分人都从没接触过大数据,对于应该如何学习大数据一头雾水。大数据学习并不是高深莫测的,虽然它并没有多简单,但是通过努力...

董黎明
12分钟前
0
0
shell习题_3

1:监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,如果大于500则自动重启httpd服务;并检测是否启动成功; 如果没有正常启动还需要再启动一次,最大不成功数超过五次立即发邮件给管理...

芬野de博客
12分钟前
0
0
Android 9.0 优势探讨

我们来谈论一下 Android。尽管 Android 只是一款内核经过修改的 Linux,但经过多年的发展,Android 开发者们(或许包括正在阅读这篇文章的你)已经为这个平台的演变做出了很多值得称道的贡献...

问题终结者
29分钟前
1
0
vue 组件使用中的一些细节点

细节一 基础例子 运行结果: 以上大家都懂,这边就不多说,回到代码里,有时候我们需要 tbody 里面每一行是一个子组件,那我们代码可以怎么写呢?我们可以这样写,定义一个全局组件,如下: ...

peakedness丶
36分钟前
2
0
vue 之 css module的使用方法

动手之前先配置项目,网上很多文章说需要下载css-loader插件,Vue中的vue-loader已经集成了 CSS Modules,因此删掉也能正常运行 在vue.config.js中添加如下配置 `css: {``loaderOptions: ...

前端小攻略
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部