首页 > 编程语言 > 详细

Spring/Spring-Boot 学习 HandlerMethodArgumentResolver接口

时间:2019-11-29 14:46:29      阅读:65      评论:0      收藏:0      [点我收藏+]

Overview

问题称述

这一节的示例采用上一篇中的项目 :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注解,我们需要分别为这四个属性接收idnamegendergrade参数,然后在add方法里面构造Student对象,再调用service方法保存。
这么写的问题主要有:

  1. 如果Student的属性很多,比如有十几个,那么add方法的参数签名就会非常长,且容易出错;
  2. 构造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.javaadd()方法如下:

@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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!