这一节的示例采用上一篇中的项目 :Spring/Spring-Boot 学习 连接redis数据库
我们看一下这个项目里面的Controller
部分代码,重点看一下它的add
方法是怎么接收客户端传参的:
StudentController.java
@RestController
@RequestMapping("/demo")
public class StudentController {
@Autowired
StudentService studentService;
@PostMapping(path = "/add")
public @ResponseBody String add(@RequestParam String id, @RequestParam String name, @RequestParam String gender, @RequestParam int grade){
studentService.add(new Student(id, name, gender, grade));
return "OK";
}
}
可以看到为了接收从客户端传来的Student
的四个属性,通过@RequestParm
注解,我们需要分别为这四个属性接收id
、name
、gender
、grade
参数,然后在add
方法里面构造Student
对象,再调用service
方法保存。
这么写的问题主要有:
Student
的属性很多,比如有十几个,那么add
方法的参数签名就会非常长,且容易出错;Student
对象不属于Controller
的业务职责,这样写让Controller
的业务逻辑混乱。要解决上述的第一个问题,可以用HttpServletRequest
作为add
方法入参,这样可以避免add
方法的签名过长:
@RestController
@RequestMapping("/demo")
public class StudentController {
@Autowired
StudentService studentService;
@PostMapping(path = "/add")
public @ResponseBody String add(HttpServletRequest request){
String id = request.getParameter("id");
String name = request.getParameter("name");
String gender = request.getParameter("gender");
int grade = Integer.parseInt(request.getParameter("grade"));
studentService.add(new Student(id, name, gender, grade));
return "OK";
}
}
这样做可以统一入参,但需要在add
方法中添加提取参数和构造Student
对象的逻辑,没有解决上述的第二个问题,反而使得controller
的业务逻辑更加混乱。
我们希望add
方法可以直接接收Student
对象,不用自己提取参数、组装Student
对象,也就是说,我们希望StudentController.java
的add()
方法如下:
@RestController
@RequestMapping("/demo")
public class StudentController {
@Autowired
StudentService studentService;
@PostMapping(path = "/add")
public @ResponseBody String add(Student student){
studentService.add(student));
return "OK";
}
}
Spring/Spring-Boot 学习 HandlerMethodArgumentResolver接口
原文:https://www.cnblogs.com/greatLong/p/11957421.html