手摸手,一起重温SpringBoot 2知识点(六)@ControllerAdvice请求参数预处理

前言

在以前的文章中SpringBoot优雅的全局异常处理(二)——@RestControllerAdvice已经介绍过增强注解@ControllerAdvice,其实它的作用不止是来处理全局异常,还可以用来预设全局数据和预处理请求参数。下面来看看如何用@ControllerAdvice来进行请求参数预处理。

一、问题展示

  1. 新建两个实体类Book和Author

    Book

    package com.junya.areyouok.entity;
    
    import lombok.Data;
    
    /**
     * @author ZHANGCHAO
     * @date 2020/5/15 16:29
     * @since 1.0.0
     */
    @Data
    public class Book {
        private String name;
        private Double price;
    }
    

    Author

    package com.junya.areyouok.entity;
    
    import lombok.Data;
    
    /**
     * @author ZHANGCHAO
     * @date 2020/5/15 16:30
     * @since 1.0.0
     */
    @Data
    public class Author {
        private String name;
        private Integer age;
    }
    

    两个实体有一个相同的属性:name

  2. 新建BookController类,写一个增加方法,接收Book和Author参数并打印出来

    package com.junya.areyouok.controller;
    
    import com.junya.areyouok.entity.Author;
    import com.junya.areyouok.entity.Book;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author ZHANGCHAO
     * @date 2020/5/15 16:31
     * @since 1.0.0
     */
    @RestController
    public class BookController {
    
        @PostMapping("/addBook")
        public void addBook(Book book, Author author){
            System.out.println(book);
            System.out.println(author);
        }
    }
    
  3. 打开postman,执行请求,如下:

    TIM截图20200515170121

    TIM截图20200515170330

这个时候,添加操作就会有问题,因为两个实体类都有一个 name 属性,从前端传递时 ,无法区分。此时,通过 @ControllerAdvice 的全局数据预处理可以解决这个问题。

二、解决问题之请求参数预处理

  1. 方法中变量取别名

    package com.junya.areyouok.controller;
    
    import com.junya.areyouok.entity.Author;
    import com.junya.areyouok.entity.Book;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @program are-you-ok
     * @description:
     * @author: zhangchao
     * @date: 2020/05/16 16:24
     * @since: 1.0.0
     */
    @RestController
    public class BookController {
    
        @PostMapping("/addBook")
        public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) {
            System.out.println(book);
            System.out.println(author);
        }
    }
    
  2. 新建请求预处理类GlobalData,增加两个方法,分别处理a和b的前缀

    package com.junya.areyouok;
    
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.InitBinder;
    
    /**
     * @program are-you-ok
     * @description:
     * @author: zhangchao
     * @date: 2020/05/16 16:30
     * @since: 1.0.0
     */
    @ControllerAdvice
    public class GlobalData {
    
        @InitBinder("a")
        public void initA(WebDataBinder binder){
            binder.setFieldDefaultPrefix("a.");
        }
    
        @InitBinder("b")
        public void initB(WebDataBinder binder){
            binder.setFieldDefaultPrefix("b.");
        }
    }
    

    @InitBinder(“b”) 注解表示该方法用来处理和Book和相关的参数,在方法中,给参数添加一个 b 前缀,即请求参数要有b前缀。

    注意,postman中请求参数前也要加前缀:

    image-20200516163523604

  3. 重启项目,再次发送请求

    image-20200516163653164

OK,接收参数已成功赋值到相应的实体类上了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值