SpringBoot使用RESTful风格时遇到的路径冲突问题和解决办法
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。
SpringBoot中使用RESTfuf风格:
- 没有使用RESTful风格时的请求方法
/**
* 如果方法里面返回的都是json对象,
* 可在类上面加添加@RestController注解
* 相当于在类上面加了@Controller并且在
* 每一个方法里面添加了@ResponseBody
*/
//@Controller
@RestController
public class StudentController {
@RequestMapping(value = "/student/detail")
//@ResponseBody
public Object student(Integer id,String name){
Student student = new Student();
student.setId(id);
student.setName(name);
return student;
}
}
- 使用RESTful风格,需要在形参添加@PathVariable注解
@RestController
public class StudentController {
@RequestMapping(value = "/student/detail/{id}/{name}")
public Object student2(@PathVariable("id") Integer id,
@PathVariable("name") String name){
Student student = new Student();
student.setId(id);
student.setName(name);
return student;
}
}
这时如果再来一个参数类型相同的请求方法,就会报错。
@RestController
public class StudentController {
@RequestMapping(value = "/student/detail/{id}/{name}")
public Object student2(@PathVariable("id") Integer id,
@PathVariable("name") String name){
Student student = new Student();
student.setId(id);
student.setName(name);
return student;
}
@RequestMapping(value = "/student/detail/{id}/{detail}")
public Object student3(@PathVariable("id") Integer id,
@PathVariable("detail") String detail){
Student student = new Student();
student.setId(id);
student.setName(detail);
return student;
}
}
这时,我们有两种解决方案
1、将@RequestMapping改成PostMapping或者@DeleteMapping等注解
@PostMapping(value = "/student/detail/{id}/{detail}")
public Object student3(@PathVariable("id") Integer id,
@PathVariable("detail") String detail){
Student student = new Student();
student.setId(id);
student.setName(detail);
return student;
}
2、改变请求路径
@RequestMapping(value = "/student/{id}/detail/{detail}")
public Object student3(@PathVariable("id") Integer id,
@PathVariable("detail") String detail){
Student student = new Student();
student.setId(id);
student.setName(detail);
return student;
}