一、传递方式
1、查询参数&路径参数
查询参数: URI:/teachers?type=web
@GetMapping("/klasses/teachers")
public List<Teacher> getKlassRelatedTeachers(String type ) {
...
}
如果查询参数type与方法的名称相同,则直接将web传入type参数。如果不同则使用@RequestParma注解指定名称。@RequestParma注解使用方法自行百度。如果没有传入相应的参数的话,那么框架会把该形参设置为默认值。
注意!!! 如果在参数上加入了@RequestParam注解的话,并且没有指定它的required属性为false(required默认为true代表必须提供该参数),如果前端没有传递该参数的话会报错!!
路径参数:
/klasses/{klassId}
@PathVariable
用于获取路径参数
@GetMapping("/klasses/{klassId}/teachers")
public List<Teacher> getKlassRelatedTeachers(@PathVariable("klassId") Long klassId,@RequestParam(value = "type", required = false) String type ) {
...
}
2、请求体
参数映射规则
- 基本类型和包装类型:
-
- 当查询参数是基本类型(如int、double、boolean等)或其对应的包装类型时,SpringMVC框架会尝试将字符串形式的查询参数自动转换为相应的类型。
- 日期和时间类型:
-
- 如果方法参数是一个java.util.Date或者Java 8引入的java.time包中的日期/时间类,Spring MVC可以通过@DateTimeFormat注解指定日期时间格式,并据此解析查询参数。
- 数组和集合:
-
- 通过逗号分隔的查询参数可以被转换为数组或List类型的参数。例/api/setmeal?ids=1,2,3,4
- 若前端传递的是多个同名查询参数,如?ids=1&ids=2&ids=3,也会自动收集到一个数组或List中。
- 自定义对象:
-
- 对于复杂类型,如自定义对象,可以通过@ModelAttribute或@RequestBody注解结合Jackson库(JSON序列化/反序列化库)进行绑定和转换。
查询参数也可以使用一个实体类型接收,但是要注意以下情况:
GET请求中使用实体类来接收所有可能的参数,并且有以下两种情况:
- json未传入实体类中存在的属性: 如果实体类中有某些属性在请求中没有对应的参数,那么在默认情况下,这些属性的值将会是它们的默认值(例如基本类型为0或null,对象引用为null)。实体类中的字段如果没有提供默认值,也不会自动填充,将在控制器方法中保持null状态。
- 实体类中不存在json请求传入的参数: 对于GET请求而言,如果请求包含了实体类中没有定义的参数,Spring MVC在处理这些参数时会忽略它们,不会引发错误,除非你配置了严格的模式来检查未知的请求参数。
GET请求参数通常是通过查询参数(query parameters)的形式附加在URL后,或者作为路径变量(path variables)嵌入在URI路径中。而POST、PUT等请求通常会使用@RequestBody注解结合JSON数据将请求体映射到一个实体类。
使用@RequestBody注解声明的形参,如果传入的JSON数据中没有对应的属性:
- 默认情况下,Spring MVC会尝试将接收到的所有JSON数据映射到该形参对应的Java对象上。如果没有包含与Java对象属性相对应的JSON字段,则该Java对象中对应属性的值将会是它们的默认值(如基本类型为0或null,对象引用为null)。也就是说,如果没有传入该形参的属性,不会直接导致错误,但未传入的属性在Java对象中将保持未初始化状态。
- 对于传入了额外的、形参没有的属性:如果传入的JSON数据包含了一些在Java对象中不存在的属性,Jackson等JSON库在默认情况下会忽略这些额外的属性,不会直接引发错误。除非你配置了严格的JSON解析模式(例如启用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES),在这种严格模式下,未知属性会导致反序列化失败并抛出异常。