返回顶部
首页 > 资讯 > 后端开发 > Python >Spring的@RequestParam对象绑定方式
  • 140
分享到

Spring的@RequestParam对象绑定方式

2024-04-02 19:04:59 140人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录spring @RequestParam对象绑定解决方案在POJO中对请求参数进行校验springMVC参数绑定自定义对象JSON提交fORM提交小结一下Spring @Requ

Spring @RequestParam对象绑定

在Spring中,如果在方法参数列表中使用@RequestParam标注多个参数,会让映射方法的可读性大大降低。

如果映射请求的参数只有一两个的话,使用@RequestParam会非常直观,但是如果参数列表越来越长,就很容易晕菜。

解决方案

可以直接使用ParameterObject模式来处理【注:ParameterObject就是把参数组装成对象】。

如果要传参对数据库操作,则参数对应数据库中的某些字段,此时表对应的entity对象可以直接作为ParameterObject。

其他情况下则可以使用一个POJO来包装这些参数,这个POJO本身没有要求额外的注解,但是POJO本身必须包含和请求参数完全匹配的字段,标准的setter/getter,和一个无参的构造器:


class ProductCriteria {
   private String query;
   private int offset;
   private int limit;
   ProductCriteria() {
   }
   public String getQuery() {
       return query;
   }
   public void setQuery(String query) {
       this.query = query;
   }
   // other getters/setters
}
@GetMapping
List<Product> searchProducts(ProductCriteria productCriteria) {
   return productRepository.search(productCriteria);
}

在POJO中对请求参数进行校验

虽然上面的案例已经可以正常使用,但是我们知道,使用@RequestParam注解,不仅仅只是为了绑定请求参数,一个非常重要的功能是,我们可以对绑定的参数请求验证,比如参数是否必要,如果请求中缺少该参数,则我们的服务端可以拒绝该请求。

想为我们的POJO中的字段添加验证规则。如果想模仿@RequestParam(required = false)的表现,可以使用@NotNull注解在对应的字段上即可。

在更多的情况下,我们一般使用@NotBlank多于@NotNull,因为@NotBlank考虑了空字符串的情况。


final class ProductCriteria {
   @NotBlank
   private String query;
   @Min(0)
   private int offset;
   @Min(1)
   private int limi;
   // ...
}

这里务必注意一点:

仅仅只是在对象的字段上添加验证注解是不够的。

一定要在controller的方法参数里诶包中,在POJO对应的参数前加上@Valid注解。该注解会让Spring在绑定参数前执行校验动作。


@GetMapping
List<Product> searchProducts(@Valid ProductCriteria productCriteria) {
   // ...
}

@RequestParam注解的另一个非常有用的功能就是设置参数的默认值。

如果我们使用POJO的方式来绑定参数,只需要在定义参数的时候设置好字段的默认值就行了。如果请求中没有该参数,Spring不会把参数的默认值覆盖为null的。

Springmvc参数绑定自定义对象

springmvc我们经常在写controller一般都接受两种方式,一种是form提交,一种是json提交,下面就来介绍如何在这两种方式中将提交的数据自动绑定到自定义对象中。

json提交

这个比较简单,在网上搜一下一大把,这里就简单放一段代码:


@RequestMapping("/testjson")
public String testjson(@RequestBody User user){
    return "ok";
}

form提交

这个是比较头疼的,一般form有很多的参数,我们可以像下面这样写:


@RequestMapping("/test")
public String testParam(@RequestParam(name = "name") String name, @RequestParam(name = "sex") String sex) {
    return name + sex;
}

但是如果我改成下面这样会怎么样?然后用form提交参数 name=zack & sex=boy


@RequestMapping("/test")
public String test(@RequestParam(name = "user") User user) {
    return user.getName();
}

结果是报错:

{
"timestamp": "2018-05-29T11:58:37.450+0000",
"status": 400,
"error": "Bad Request",
"message": "Required User parameter 'user' is not present",
"path": "/test1"
}

我的参数里确实是没有user这个,其实我的原本目的是想让spring把我传递的name和sex熟悉拼装好生成一个user对象,因为刚好user对象就有这2个属性,spring可没有智能。那该怎么办?

这个时候引入WEBDataBinder, 在你的controller里加上下面的代码:


@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.reGISterCustomEditor(User.class, new UserFormatEditor());
}
public static class UserFormatEditor extends PropertiesEditor {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(JSONObject.parseObject(text, User.class));
    }
    @Override
    public String getAsText() {
        return getValue().toString();
    }
}

然后在请求时将参数改为 user = {"name":"zack","sex":"boy"} ,之后就成功的获取User对象,WebDataBinder帮我们告诉了spring,如果遇到了一个字符串参数要被包装成User.class,用我们自定义的UserFormatEditor就行。

小结一下

作为规范而言,form提交的方式本身就需要我们一个一个属性的接收,而不能用一个对象统一接收,如果你想用一个对象统一接收,请采用json的方式提交。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Spring的@RequestParam对象绑定方式

本文链接: https://lsjlt.com/news/155383.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring的@RequestParam对象绑定方式
    目录Spring @RequestParam对象绑定解决方案在POJO中对请求参数进行校验SpringMvc参数绑定自定义对象json提交form提交小结一下Spring @Requ...
    99+
    2024-04-02
  • 类与对象的绑定方法
    目录 类与对象的绑定方法 类的绑定对象 对象的绑定方法 class OldboyStudent: school ...
    99+
    2023-01-31
    绑定 对象 方法
  • Spring MVC数据绑定方式
    目录基本类型、包装类型、数组(以参数age为例)一、基本类型二、包装类型三、数组简单对象、多层级对象、同属性对象一、简单对象(User类:name, age)二、多层级对象(User...
    99+
    2022-11-13
    Spring MVC 数据绑定 SpringMVC数据绑定
  • Python中类和对象的绑定及非绑定方法详解
    目录一、绑定方法1 对象的绑定方法2 类的绑定方法二、非绑定方法三、练习1 绑定方法小结2 非绑定方法小结类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为...
    99+
    2023-03-03
    Python类 绑定方法 Pytho 对象绑定方法 Python类 对象绑定方法
  • Python中类和对象的绑定及非绑定方法是什么
    类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。一、绑定方法1 对象的绑定方法在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制。class Pers...
    99+
    2023-05-19
    Python
  • Spring-AOP @AspectJ进阶之如何绑定代理对象
    概述 使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方法中同名入参的类型间接决定罢了。 这里我...
    99+
    2024-04-02
  • Spring IOC创建对象的两种方式
    IOC创建对象的方式 一、 使用无参构造创建对象(默认方式) 创建实体类 注意:属性必须要有set方法,来完成注入 public class User { private S...
    99+
    2024-04-02
  • JavaScript对象方法中绑定实例分析
    今天小编给大家分享一下JavaScript对象方法中绑定实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2024-04-02
  • wpf怎么绑定对象的属性
    在WPF中,可以使用数据绑定来绑定对象的属性。 首先,确保你的对象实现了INotifyPropertyChanged接口。这个接口定...
    99+
    2023-10-24
    wpf
  • Spring复杂对象创建的方式小结
    在Spring中,对于简单类型的创建,我们可以使用set注入和构造注入。但是对于复杂类型的如何创建? 什么是复杂类型,比如连接数据库的Connection对象,以及Mybatis中的...
    99+
    2024-04-02
  • 第27天面向对象之反射,绑定方法,特定的
    绑定方法与非绑定方法 绑定方法(其实并没有这样的说法,只是为了解释三个装饰器而说出来的比较容易记名词)  绑定方法的核心就是,谁绑定的就应该给谁来调用,谁来调用我们就会将谁作为第一个参数传递进去。  绑定对象方法:应该被对象来调用,py...
    99+
    2023-01-30
    绑定 反射 面向对象
  • Spring Data JPA 映射VO/DTO对象方式
    目录SpringDataJPA映射VO/DTO对象HQL方式原生SQL的形式SpringDataJpa自定义repository转DTOSpring Data JPA 映射VO/DT...
    99+
    2024-04-02
  • spring mvc @PathVariable绑定URI模板变量值方式
    目录@PathVariable绑定URI模板变量值@RequestParam(参数绑定到控制器)和@PathVariable(参数绑定到url模板变量)@PathVariable绑定...
    99+
    2024-04-02
  • Spring IOC简单理解及创建对象的方式
    spring框架 控制反转(Inversion on Control)在spring框架里面,一般交给Spring容器,这叫控制反转 什么是控制反转呢? 先来说一下控制正转, c...
    99+
    2024-04-02
  • Spring成员对象注入的三种方式详解
    目录一、@Autowired注解@Qualifier@Primary二、@Resource注解三、@Inject和@Named注解总结当一个类运行需要调用一个成员对象,成员对象也是被...
    99+
    2024-04-02
  • Flex数据绑定中如何绑定到函数、对象和数组
    这篇文章主要介绍了Flex数据绑定中如何绑定到函数、对象和数组,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex数据绑定1.绑定到函数、对象和数组(1)绑定函数以响应Fl...
    99+
    2023-06-17
  • Spring AOP 对象内部方法间的嵌套调用方式
    目录Spring AOP 对象内部方法间的嵌套调用我们先定义一个接口以及此接口的一个实现类增加AOP处理同一对象内的嵌套方法调用AOP失效原因分析举一个同一对象内的嵌套方法调用拦截失...
    99+
    2024-04-02
  • Vue中的事件绑定与解绑方式
    目录事件绑定基础知识使用场景注意事项v-on 绑定事件语法实例$ref绑定事件语法实例事件解绑语法实例 总结事件绑定 基础知识 使用场景 子组件==>父组件传数据在父...
    99+
    2022-11-13
    Vue 事件绑定 Vue 事件解绑 Vue 事件
  • Spring使用注解方式实现创建对象
    首先 我们要搞清楚一个基础概念 什么是注解? 注解 可以说是代码里的一些特殊标记。 格式是 @() 里面可以有 属性=属性的值 可以有多个属性值 多属性值之间 用逗号隔开 注解 可以...
    99+
    2023-02-06
    Spring创建对象 Spring注解方式创建对象
  • Spring Boot中单例类实现对象的注入方式
    Spring Boot 单例类实现对象的注入 1、最近接手了一个项目 项目用的是SpringBoot,但其中有个类用的是单例,为了不改变单例,且还需要引入Spring管理的Bean对...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作