解决SpringMVC @RequestMapping不设置value出现的问题

目录
  • SpringMVC @RequestMapping不设置value
    • 从上个项目拷贝过来的form的action属性忘了修改了
  • Spring mvc中@RequestMapping 6个基本用法小结
    • 1、最基本的,方法级别上应用
    • 2、参数绑定
    • 3、REST风格的参数
    • 4、REST风格的参数绑定形式之2
    • 5、url中同时绑定多个id
    • 6、支持正则表达式

SpringMVC @RequestMapping不设置value

从上个项目拷贝过来的form的action属性忘了修改了

在controller上没有设置@RequestMapping,方法上设置了但忘记设置value值,没想到还是能访问到,弄拙成巧,让我发现了这个问题

本以为会默认按照方法名来访问,当我修改方法名后依然能访问到

猜想会以表单字段和参数列表的对应关系来访问,修改后依然能访问到

因为我这个项目所有的controller的命名空间没有一个是“account”,所以猜想当SpringMVC无法匹配到对应的controller时会访问@RequestMapping没有配置value的方法, 于是新建一个Controller类,也是只在方法上配置了一个没有设置value的@RequestMapping,

这时启动tomcat报错:

Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'testController' bean method
public java.lang.String com.ld.controller.TestController.login(java.lang.String,java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest)
to {[]}: There is already 'loginController' bean method
public java.lang.String com.ld.controller.LoginController.login(java.lang.String,java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest) mapped.
 at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:212)
 at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:184)
 at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:144)
 at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:123)
 at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:126)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
 ... 36 more

说明猜想正确,两个controller冲突了

后经测试,当@RequestMapping设置method属性,如一个方法上设置为GET,另一个设置为POST,http请求的方式不同,不会冲突,会找到对应的方法执行。

Spring mvc中@RequestMapping 6个基本用法小结

小结下spring mvc中的@RequestMapping的用法

1、最基本的,方法级别上应用

例如:

@RequestMapping(value="/departments")
public String simplePattern(){
  System.out.println("simplePattern method was called");
  return "someResult";
}  

则访问http://localhost/xxxx/departments的时候,会调用 simplePattern方法了

2、参数绑定

@RequestMapping(value="/departments")
public String findDepatment(
  @RequestParam("departmentId") String departmentId){
    System.out.println("Find department with ID: " + departmentId);
    return "someResult";
}  

形如这样的访问形式:

/departments?departmentId=23就可以触发访问findDepatment方法了

3、REST风格的参数

@RequestMapping(value="/departments/{departmentId}")
public String findDepatment(@PathVariable String departmentId){
  System.out.println("Find department with ID: " + departmentId);
  return "someResult";
}  

形如REST风格的地址访问,比如:

/departments/23,其中用(@PathVariable接收rest风格的参数

4、REST风格的参数绑定形式之2

先看例子,这个有点象之前的:

@RequestMapping(value="/departments/{departmentId}")
public String findDepatmentAlternative(
  @PathVariable("departmentId") String someDepartmentId){
    System.out.println("Find department with ID: " + someDepartmentId);
    return "someResult";
}  

这个有点不同,就是接收形如/departments/23的URL访问,把23作为传入的departmetnId,,但是在实际的方法findDepatmentAlternative中,使用

@PathVariable("departmentId") String someDepartmentId

将其绑定为 someDepartmentId,所以这里someDepartmentId为23

5、url中同时绑定多个id

@RequestMapping(value="/departments/{departmentId}/employees/{employeeId}")
public String findEmployee(
  @PathVariable String departmentId,
  @PathVariable String employeeId){
    System.out.println("Find employee with ID: " + employeeId +
      " from department: " + departmentId);
    return "someResult";
}  

这个其实也比较好理解了。

6、支持正则表达式

@RequestMapping(value="/{textualPart:[a-z-]+}.{numericPart:[\\d]+}")
public String regularExpression(
  @PathVariable String textualPart,
  @PathVariable String numericPart){
    System.out.println("Textual part: " + textualPart +
      ", numeric part: " + numericPart);
    return "someResult";
}  

比如如下的URL:/sometext.123,则输出:

Textual part: sometext, numeric part: 123.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringMVC注解@RequestParam方法原理解析

    一.作用 作用在方法传递的参数前,用于接收所传参数 例如:http://localhost:8081/selectStudentById?id=01 接收问号后面的参数值(允许多个参数) 二.注解内部的四个属性 1.name 指定传入的参数名称,其后面跟的参数名称一定要与前端传入的参数名称一致 2.value 指定传入的参数名称,其后面跟的参数名称一定要与前端传入的参数名称一致 3.requred 指定参数是否是必传参数,如果不指定,默认为true 4.defaultValue 指定参数的默认值

  • 彻底解决Spring MVC中文乱码问题的方案

    乱码是让人很头疼的一件事,本文介绍了彻底解决Spring MVC中文乱码问题的方案,具体如下:  1:表单提交controller获得中文参数后乱码解决方案 注意:  jsp页面编码设置为UTF-8 form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <form

  • Spring MVC Controller返回值及异常的统一处理方法

    旧的设计方案 开发api的时候,需要先定义好接口的数据响应结果.如下是一个很简单直接的Controller实现方法及响应结果定义. @RestController @RequestMapping("/users") public class UserController { @Inject private UserService userService; @GetRequest("/{userId:\\d+}") public ResponseBean signin

  • SpringMVC中RequestMapping注解(作用、出现的位置、属性)

    RequestMapping注解 作用出现位置属性 作用 用于建立请求 URL 和处理请求方法之间的对应关系. 出现位置 1.作用在类上:请求 URL 的第一级访问目录.此处不写的话,就相当于应用的根目录.写的话需要以/开头. 2.作用在方法上:请求 URL 的第二级访问目录. 控制器中部分代码示例: @Controller @RequestMapping(path = "/user") //第一级的访问目录 public class HelloController { @Reques

  • 解决SpringMVC @RequestMapping不设置value出现的问题

    目录 SpringMVC @RequestMapping不设置value 从上个项目拷贝过来的form的action属性忘了修改了 Spring mvc中@RequestMapping 6个基本用法小结 1.最基本的,方法级别上应用 2.参数绑定 3.REST风格的参数 4.REST风格的参数绑定形式之2 5.url中同时绑定多个id 6.支持正则表达式 SpringMVC @RequestMapping不设置value 从上个项目拷贝过来的form的action属性忘了修改了 在control

  • 解决SpringMvc后台接收json数据中文乱码问题的几种方法

    1.使用ajax从前台页面传输数据到后台controller控制器的时候,出现中文乱码(问号???). 之前在网上找了各种解决方案,都行不通,最后发现是tomcat服务器接收数据的问题 解决方案: 方式一:在controller接收参数时,对参数进行转码 @ResponseBody @RequestMapping(value="/getJsonDataByCityName",produces="application/json") public String get

  • 解决SpringMVC使用@RequestBody注解报400错误的问题

    一般使用@RequestBody接收的时候报400都是传入的json字符串和对应封装的对象不对应造成的 首先要注意 封装的对象中的字段类型有没有Date类型或者int等类型的,如果有的话,在set方法中统一将传入的参数要调整为String类型 在set方法中进行参数的转换 比如有一个Date类型的字段 private Date startTime; public Date getStartTime() { return startTime; } public void setStartTime(

  • 快速解决SpringMVC @RequestBody 用map接收请求参数的问题

    一:遇到个跨域调用,因为传个我的参数不定,所以需要通过map来接收参数并进行签名验证等操作 理所当然的写出了下面的代码,但是发现map里并没有获取到传来的key-value值 @RequestMapping(value = "/callback", produces = "text/html;charset=UTF-8") @ResponseBody public String callback(@RequestBody Map<String, String&

  • 解决SpringMVC同时接收Json和Restful时Request里有Map的问题

    现在正在做的项目要将旧系统实现微服务,用 SpringBoot 来做,有时候同一个 Request 就要同时接收来自 ajax 的 Json 数据和 Restful 的数据,如果里面还包含 Map 怎么办呢? 最近就只想出了这种办法,仅供参考.如有错误请指正,谢谢. 代码 Json 数据 { "fieldMap": { "middleName": "1", "mailingAddress": "2", &q

  • SpringMVC @RequestMapping注解详解

    目录 一.@RequestMapping 1.@RequestMapping注解的功能 2.@RequestMapping注解的位置 二.@RequestMapping注解的属性 1.value属性(掌握) 2.method属性(掌握) 3.params属性(了解) 4.headers属性(了解) 5.SpringMVC支持ant风格的路径 6.SpringMVC支持路径中的占位符(重点) 三.@RequestMapping的派生类注解 测试form表单是否支持put或delete方式的请求 一

  • 解决springMVC 跳转js css图片等静态资源无法加载的问题

    web.xml中 servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-va

  • 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    页面报错: 后台错误: Field error in object 'user' on field 'birthday': rejected value [2013-06-24]; codes [typeMismatch.user.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessag

  • 解决layui-table单元格设置为百分比在ie8下不能自适应的问题

    1.如果没有采用响应式布局,指定表格的宽度即可解决比如 table{ width:1400px !important; } 2.如果采用了响应式布局,使用media query查询不同分辨率下的table宽度,然后指定大小即可,在ie8下支持css3和响应式可以使用 selectivizr-min.js和respond.js. 代码如下 <script src="${LUI_ContextPath}/resource/js/jquery.js"></script>

  • 解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题

    新配置一个spring的MVC项目,发现对Get请求的中文参数出现了乱码: 查看了SpingMVC中关于编码的配置(在web.xml中),如下: <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param>

随机推荐