WensonSmith

WensonSmith 查看完整档案

上海编辑  |  填写毕业院校  |  填写所在公司/组织 www.seekbetter.me 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

WensonSmith 赞了文章 · 2019-12-25

首发,laravel最优雅的分表、关联、分页查询,手册方法的熟练运用。

前几天写了一遍关于laravel分表关联的查询,但是我个人觉得还不算完美,于是今天重新看了一下laravel模型的底层代码,终于写出我暂时觉得最满意的代码-laravel风格,简洁、优雅是核心。

下面直接上demo代码,主要是3个表,一个用户表,一个是用户送礼表,送礼表按月分表

user表
id用户ID
nickname昵称

<?php

namespace App\Models;

use Eloquent;

class User extends Eloquent
{
  
}

send_gift_2017_07,send_gift_2017_08 送礼表
id自增主键
user_id用户ID
worth礼物价值
uper_id主播ID(也是用户表的)
created_at送礼时间

<?php

namespace App\Models;

use Eloquent;

class SendGift extends Eloquent
{
    //关联用户表,外键是user_id
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    
    关联用户表 外键是uper_id
    public function uper()
    {
        return $this->belongsTo(User::class);
    }
}

现在做一个输入开始日期和结束日期查看用户的送礼记录并且分页。

<?php

namespace App\Http\Controllers;

use App\Models\SendGift;
use DB;
use Carbon\Carbon;

class IndexController extends Controller
{
    public function index()
    {

        // 开始日期,和日期有关的,都建议用内置的carbon处理,非常好用,而且简洁
        $start = Carbon::parse(request('start'));
        // 结束日期
        $end = Carbon::parse(request('end'));
        // 查询集合
        $queries = collect();
        
        // 循环比较年月,添加每一张表的查询
        for ($i = $start->copy(); $i->format('Y-m') <= $end->format('Y-m'); $i->addMonth()) {
            $queries->push(
                DB::table("send_gift_{$i->format('Y_m')}")
                    // 建议都用select查询字段,SQL尽可能的优化性能
                    ->select('user_id', 'worth', 'uper_id', 'created_at')
                    ->whereBetween('created_at', [$start, $end->tomorrow()])
            );
        }

        // 出列一张表作为union的开始
        $unionQuery = $queries->shift();
        // 循环剩下的表添加union
        $queries->each(function ($item, $key) use ($unionQuery) {
            $unionQuery->unionAll($item);
        });

        // 设置临时表的名称,添加临时表,顺序不能反过来,否则用关联约束会找不到表
        $lists = with(new SendGift)->setTable('union_send_gift')
            // 添加临时表
            ->from(DB::raw("({$unionQuery->toSql()}) as union_send_gift"))
            // 合并查询条件
            ->mergeBindings($unionQuery)
            // 关联约束,不在用户表的不用查出来
            ->has('user')
            // 按时间倒序
            ->orderBy('created_at', 'desc')
            // 分页
            ->paginate();

        // 加载关联关系
        $lists->load([
            'user' => function ($query) {
                // 关联查询也要优化sql
                $query->select('id', 'nickname');
            },
            'uper' => function ($query) {
                $query->select('id', 'nickname');
            }
        ]);

        // 测试结果
        $lists->each(function ($item, $key) {
            echo "用户:{$item->user_id}-{$item->user->nickname}在{$item->created_at->toDateTimeString()}送出了价值{$item->worth}元的礼物给主播:{$item->uper_id}-{$item->uper->nickname}<br>";
        });
        
    }
}

然后我们看看SQL。

clipboard.png

关联查询用了渴求式加载,就能有效减少SQL的条数,保证数据库的性能。

查看原文

赞 27 收藏 32 评论 2

WensonSmith 赞了回答 · 2019-12-06

解决树状结构的数据表如何设计?

使用Modified Preorder Tree简直是必须的。网上可以搜一下modified preorder tree travesal找到相关资料。参考 http://www.sitepoint.com/hierarchical...

至于你说的binary tree和general tree的问题,这是个树的基本操作了,互相转换问题不大。参考 http://en.wikipedia.org/wiki/Binary_t...

----------------------

好吧我忘了提一个很dirty的方法。

如果你的树深度是可预期的话,有个超简单的数据结构。你需要3个字段来表达这个树:

  1. id,本节点的primary key
  2. parent_id,其值为父节点的primary key
  3. key,忘了学名叫啥了,你可以称为线索
  4. level,表示当前节点到根节点的距离

其中,key字段的值为:从跟节点到父节点的primary key,中间用任意非数字符号分割。

例如以下树状结构

├── a
│   ├── d
│   │   ├── p
│   │   ├── q
│   │   └── r
│   ├── e
│   └── f
├── b
│   ├── x
│   ├── y
│   └── z
├── c

对应的数据库表值为:

| id | value | parent_id | key   | level |                                
| 1  | a     | 0         | "-"    | 1     |
| 2  | b     | 0         | "-"    | 1     |
| 3  | c     | 0         | "-"    | 2     |
| 4  | d     | 1         | "1-"   | 2     |
| 5  | e     | 1         | "1-"   | 2     |
| 6  | f     | 1         | "1-"   | 2     |
| 7  | x     | 2         | "2-"   | 2     |
| 8  | y     | 2         | "2-"   | 2     |
| 9  | z     | 2         | "2-"   | 2     |
| 10 | p     | 4         | "1-4-" | 3     |
| 11 | q     | 4         | "1-4-" | 3     |
| 12 | r     | 4         | "1-4-" | 3     |

于是,在给定一个节点d的时候,

  1. 查找d的所有子孙节点:select * from table_name where key like "${d.key}-${d.id}-%"
  2. 查找某个节点的所有子节点:select * from table_name where key like "${d.key}-${d.id}-%" and level=${d.level}+1

这个设计,结构非常简单。key和level是辅助字段,维护这两个字段成本很低,即使全部重建要比MPT简单多了。

关注 19 回答 9

WensonSmith 收藏了问题 · 2019-10-17

树状结构的数据表如何设计?

这棵树(非二叉树)是这样的:

  • 有唯一根节点
  • 每个节点只有一个父节点
  • 每个节点有多个子节点

现在我的表是这样的:

node_id node_name parent_id

但是这样的设计,在查询是很麻烦,很难快速的查找某个节点下所有子节点,或者查询这个节点的族谱路径,等等。

在网上找到了【树形结构的数据库表Schema设计】这篇文章,讲的很好,主要思想是为每个节点设置左右值。当时还以为是我要的,但是,后来发现这必须是一棵二叉树,最后还是让我郁闷了。

问题就是有没有更好的设计?

WensonSmith 赞了问题 · 2019-10-17

解决树状结构的数据表如何设计?

这棵树(非二叉树)是这样的:

  • 有唯一根节点
  • 每个节点只有一个父节点
  • 每个节点有多个子节点

现在我的表是这样的:

node_id node_name parent_id

但是这样的设计,在查询是很麻烦,很难快速的查找某个节点下所有子节点,或者查询这个节点的族谱路径,等等。

在网上找到了【树形结构的数据库表Schema设计】这篇文章,讲的很好,主要思想是为每个节点设置左右值。当时还以为是我要的,但是,后来发现这必须是一棵二叉树,最后还是让我郁闷了。

问题就是有没有更好的设计?

关注 19 回答 9

WensonSmith 关注了专栏 · 2019-10-10

advanced-php

advanced php,托大了,托大了

关注 1440

WensonSmith 收藏了文章 · 2019-08-16

Spring MVC Controller 嵌套参数在三种 Content-Type 下的绑定方式

以下将介绍 application/jsonmultipart/form-data, application/x-www-form-urlencoded 三种 Content-Type 传参情况下,Spring MVC 控制器中参数绑定的方式。

1. 前置内容

1.1 关于三种 Content-Type

这里主要介绍三种 Content-Type:

  1. multipart/form-data 请求中既可以携带文件,又可以携带参数。其中参数以键值对的方式传递,参数之间、参数与文件之间以 content-disposition 分隔;
  2. application/x-www-form-urlencoded 只能上传参数,不能携带文件,参数通过 ?xxx=xxx&xxx=xxx 的方式被组织在一起;
  3. application/json 只能上传参数,不能携带文件,参数不被特殊组织,保持原 JSON 字符串的形式。

1.2 扩展:浏览器调试工具中请求参数的形式

在前端发送请求时,我们可以通过浏览器看到请求的参数。在浏览器调试工具中,参数栏会有多种标题:

  1. Query String Parameters


当使用 GET 方式提交请求时,采用这一标题

  1. Request Payload


当使用 application/json 方式提交时,采用这一标题

  1. Form Data


当使用 multipart/form-dataapplication/x-www-form-urlencoded 方式提交时,采用这一标题,注意这两种 form-data 的区别。

1.3 测试数据

这里采用嵌套数据如下:

{
    "username": "dailybird",
    "password": "dailybirdo",
  "ids": [1,2,3],
    "detail": {
        "gender": "male",
        "location": "Beijing",
    "ids": [4,5,6]
    }
}

注:与文件上传相关的参数后面会单独提到,这里先进行非文件参数提交的实验。

1.4 预期绑定的对象

这里,仿照请求参数的格式创建 User 对象,我们试图将请求参数绑定到该对象上。这里使用 Lombok 来减少 setter 的创建:

@ToString
@Data
public class User {
    private String username;
    private String password;
    private List<Integer> ids;

    private Detail detail;

    @Data
    public static class Detail {
        private String gender;
        private String location;
        private List<Integer> ids;
    }
}

2. 绑定方式

2.1 利用 @RequestBody 解析 application/json 的 POST请求

控制器代码如下:

  @RequestMapping(value = "/application/json")
  public String applicationJson(@RequestBody User user) {
      log.info("{}", user.toString());
      return user.toString();
  }

当使用 POST,并携带 Content-Type: application/json 头发送请求时,控制器能够完全解析嵌套的参数。

注:由于 @RequestBody 本身是调用 HttpMessageConverter 解析请求体中的数据,而 GET 方式的参数不会存在于请求体中,所以 @RequestBody 不能处理 GET 方式的请求。

2.2 利用 @RequestParam 接收 multipart/form-data 及 application/x-www-form-urlencoded 中的请求

控制器代码如下:

public String xWwwFormUrlencoded(@RequestParam("username") String username,
                                     @RequestParam("password") String password,
                                     @RequestParam("ids")List<Integer> ids,
                                     @RequestParam("detail") Detail detail) {
        log.info("{}, {}, {}, {}", username, password, ids, detail);
        return "";
    }

其中 Detail 类为与之前 User 内部类等同的类。

2.2.1 application/x-www-form-urlencoded

这里我们借助 jquery 的相关函数进行测试:

$.post("http://localhost:8083/application/x-www-form-urlencoded", {
    "username": "aaa",
    "password": "bbb",
    "ids": [1,2,3],
    "detail": {
        "gender": "ccc",
        "location": "ddd",
        "ids": [4,5,6]
    }
})

然后我们收到了如下提示:

Required List parameter 'ids' is not present

但我们确实已经发送了 ids 参数,为什么没有获取到呢?这一点我们放到之后再谈,先试一下 multipart/form-data 的方式。

2.2.2 multipart/form-data

当然,采用这一方式,我们会收到同样的提示:

Required List parameter 'ids' is not present

2.2.3 参数接收到的问题

让我们在浏览器的开发者工具中看一看请求参数实际的样子:

不同于 PHP 框架 Laravel,@RequestParam 并不会将 ids[] 之类的数组类参数和 detail[xxx] 之类的嵌套参数进行重组。因而,控制器会认为收到了 ids[] 参数,而不是 ids 参数,同理也适用于嵌套参数。

那我们该怎么做的?我在 Stack Overflow 上得到了解答,我们可以采用以下方法之一:

  1. ids[] 改为 ids 传参,即 ids=1&ids=2&... 的方式( 注意对比上图 ),将嵌套类参数 detail[gender] 等改为 detail.gender
  2. 将嵌套参数采用 Map 类型接收。

注:在 Spring MVC 中,我们可以不书写 @RequestParam,直接使用相与请求参数同名的变量进行接收( 或直接使用一个 POJO 对象 ),但该方式也存在着与以上相同的问题。

2.3 文件上传问题

最开始已经说过,若要上传文件,在上述三种 Content-Type 中,只能使用 multipart/form-data,在注意到 2.2 中所提到的问题后,我们便可以通过 MultipartFile 类型的属性来获取到文件参数了。

3. 总结

从 Laravel 过渡到 Spring Boot,确实感到了在控制器层面二者的差异( 当然在 DAO 层更是如此 ),以下给出一个列表,用以纪念自己踩的坑:

参考链接

  1. postman中 form-data、x-www-form-urlencoded、raw、binary的区别 - CSDN博客
  2. http - What's the difference between "Request Payload" vs "Form Data" as seen in Chrome dev tools Network tab - Stack Overflow
  3. spring - What is difference between @RequestBody and @RequestParam? - Stack Overflow
  4. 浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别 - CSDN博客
查看原文

WensonSmith 赞了文章 · 2019-08-16

Spring MVC Controller 嵌套参数在三种 Content-Type 下的绑定方式

以下将介绍 application/jsonmultipart/form-data, application/x-www-form-urlencoded 三种 Content-Type 传参情况下,Spring MVC 控制器中参数绑定的方式。

1. 前置内容

1.1 关于三种 Content-Type

这里主要介绍三种 Content-Type:

  1. multipart/form-data 请求中既可以携带文件,又可以携带参数。其中参数以键值对的方式传递,参数之间、参数与文件之间以 content-disposition 分隔;
  2. application/x-www-form-urlencoded 只能上传参数,不能携带文件,参数通过 ?xxx=xxx&xxx=xxx 的方式被组织在一起;
  3. application/json 只能上传参数,不能携带文件,参数不被特殊组织,保持原 JSON 字符串的形式。

1.2 扩展:浏览器调试工具中请求参数的形式

在前端发送请求时,我们可以通过浏览器看到请求的参数。在浏览器调试工具中,参数栏会有多种标题:

  1. Query String Parameters


当使用 GET 方式提交请求时,采用这一标题

  1. Request Payload


当使用 application/json 方式提交时,采用这一标题

  1. Form Data


当使用 multipart/form-dataapplication/x-www-form-urlencoded 方式提交时,采用这一标题,注意这两种 form-data 的区别。

1.3 测试数据

这里采用嵌套数据如下:

{
    "username": "dailybird",
    "password": "dailybirdo",
  "ids": [1,2,3],
    "detail": {
        "gender": "male",
        "location": "Beijing",
    "ids": [4,5,6]
    }
}

注:与文件上传相关的参数后面会单独提到,这里先进行非文件参数提交的实验。

1.4 预期绑定的对象

这里,仿照请求参数的格式创建 User 对象,我们试图将请求参数绑定到该对象上。这里使用 Lombok 来减少 setter 的创建:

@ToString
@Data
public class User {
    private String username;
    private String password;
    private List<Integer> ids;

    private Detail detail;

    @Data
    public static class Detail {
        private String gender;
        private String location;
        private List<Integer> ids;
    }
}

2. 绑定方式

2.1 利用 @RequestBody 解析 application/json 的 POST请求

控制器代码如下:

  @RequestMapping(value = "/application/json")
  public String applicationJson(@RequestBody User user) {
      log.info("{}", user.toString());
      return user.toString();
  }

当使用 POST,并携带 Content-Type: application/json 头发送请求时,控制器能够完全解析嵌套的参数。

注:由于 @RequestBody 本身是调用 HttpMessageConverter 解析请求体中的数据,而 GET 方式的参数不会存在于请求体中,所以 @RequestBody 不能处理 GET 方式的请求。

2.2 利用 @RequestParam 接收 multipart/form-data 及 application/x-www-form-urlencoded 中的请求

控制器代码如下:

public String xWwwFormUrlencoded(@RequestParam("username") String username,
                                     @RequestParam("password") String password,
                                     @RequestParam("ids")List<Integer> ids,
                                     @RequestParam("detail") Detail detail) {
        log.info("{}, {}, {}, {}", username, password, ids, detail);
        return "";
    }

其中 Detail 类为与之前 User 内部类等同的类。

2.2.1 application/x-www-form-urlencoded

这里我们借助 jquery 的相关函数进行测试:

$.post("http://localhost:8083/application/x-www-form-urlencoded", {
    "username": "aaa",
    "password": "bbb",
    "ids": [1,2,3],
    "detail": {
        "gender": "ccc",
        "location": "ddd",
        "ids": [4,5,6]
    }
})

然后我们收到了如下提示:

Required List parameter 'ids' is not present

但我们确实已经发送了 ids 参数,为什么没有获取到呢?这一点我们放到之后再谈,先试一下 multipart/form-data 的方式。

2.2.2 multipart/form-data

当然,采用这一方式,我们会收到同样的提示:

Required List parameter 'ids' is not present

2.2.3 参数接收到的问题

让我们在浏览器的开发者工具中看一看请求参数实际的样子:

不同于 PHP 框架 Laravel,@RequestParam 并不会将 ids[] 之类的数组类参数和 detail[xxx] 之类的嵌套参数进行重组。因而,控制器会认为收到了 ids[] 参数,而不是 ids 参数,同理也适用于嵌套参数。

那我们该怎么做的?我在 Stack Overflow 上得到了解答,我们可以采用以下方法之一:

  1. ids[] 改为 ids 传参,即 ids=1&ids=2&... 的方式( 注意对比上图 ),将嵌套类参数 detail[gender] 等改为 detail.gender
  2. 将嵌套参数采用 Map 类型接收。

注:在 Spring MVC 中,我们可以不书写 @RequestParam,直接使用相与请求参数同名的变量进行接收( 或直接使用一个 POJO 对象 ),但该方式也存在着与以上相同的问题。

2.3 文件上传问题

最开始已经说过,若要上传文件,在上述三种 Content-Type 中,只能使用 multipart/form-data,在注意到 2.2 中所提到的问题后,我们便可以通过 MultipartFile 类型的属性来获取到文件参数了。

3. 总结

从 Laravel 过渡到 Spring Boot,确实感到了在控制器层面二者的差异( 当然在 DAO 层更是如此 ),以下给出一个列表,用以纪念自己踩的坑:

参考链接

  1. postman中 form-data、x-www-form-urlencoded、raw、binary的区别 - CSDN博客
  2. http - What's the difference between "Request Payload" vs "Form Data" as seen in Chrome dev tools Network tab - Stack Overflow
  3. spring - What is difference between @RequestBody and @RequestParam? - Stack Overflow
  4. 浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别 - CSDN博客
查看原文

赞 5 收藏 5 评论 2

WensonSmith 赞了文章 · 2019-08-16

Spring MVC Controller 嵌套参数在三种 Content-Type 下的绑定方式

以下将介绍 application/jsonmultipart/form-data, application/x-www-form-urlencoded 三种 Content-Type 传参情况下,Spring MVC 控制器中参数绑定的方式。

1. 前置内容

1.1 关于三种 Content-Type

这里主要介绍三种 Content-Type:

  1. multipart/form-data 请求中既可以携带文件,又可以携带参数。其中参数以键值对的方式传递,参数之间、参数与文件之间以 content-disposition 分隔;
  2. application/x-www-form-urlencoded 只能上传参数,不能携带文件,参数通过 ?xxx=xxx&xxx=xxx 的方式被组织在一起;
  3. application/json 只能上传参数,不能携带文件,参数不被特殊组织,保持原 JSON 字符串的形式。

1.2 扩展:浏览器调试工具中请求参数的形式

在前端发送请求时,我们可以通过浏览器看到请求的参数。在浏览器调试工具中,参数栏会有多种标题:

  1. Query String Parameters


当使用 GET 方式提交请求时,采用这一标题

  1. Request Payload


当使用 application/json 方式提交时,采用这一标题

  1. Form Data


当使用 multipart/form-dataapplication/x-www-form-urlencoded 方式提交时,采用这一标题,注意这两种 form-data 的区别。

1.3 测试数据

这里采用嵌套数据如下:

{
    "username": "dailybird",
    "password": "dailybirdo",
  "ids": [1,2,3],
    "detail": {
        "gender": "male",
        "location": "Beijing",
    "ids": [4,5,6]
    }
}

注:与文件上传相关的参数后面会单独提到,这里先进行非文件参数提交的实验。

1.4 预期绑定的对象

这里,仿照请求参数的格式创建 User 对象,我们试图将请求参数绑定到该对象上。这里使用 Lombok 来减少 setter 的创建:

@ToString
@Data
public class User {
    private String username;
    private String password;
    private List<Integer> ids;

    private Detail detail;

    @Data
    public static class Detail {
        private String gender;
        private String location;
        private List<Integer> ids;
    }
}

2. 绑定方式

2.1 利用 @RequestBody 解析 application/json 的 POST请求

控制器代码如下:

  @RequestMapping(value = "/application/json")
  public String applicationJson(@RequestBody User user) {
      log.info("{}", user.toString());
      return user.toString();
  }

当使用 POST,并携带 Content-Type: application/json 头发送请求时,控制器能够完全解析嵌套的参数。

注:由于 @RequestBody 本身是调用 HttpMessageConverter 解析请求体中的数据,而 GET 方式的参数不会存在于请求体中,所以 @RequestBody 不能处理 GET 方式的请求。

2.2 利用 @RequestParam 接收 multipart/form-data 及 application/x-www-form-urlencoded 中的请求

控制器代码如下:

public String xWwwFormUrlencoded(@RequestParam("username") String username,
                                     @RequestParam("password") String password,
                                     @RequestParam("ids")List<Integer> ids,
                                     @RequestParam("detail") Detail detail) {
        log.info("{}, {}, {}, {}", username, password, ids, detail);
        return "";
    }

其中 Detail 类为与之前 User 内部类等同的类。

2.2.1 application/x-www-form-urlencoded

这里我们借助 jquery 的相关函数进行测试:

$.post("http://localhost:8083/application/x-www-form-urlencoded", {
    "username": "aaa",
    "password": "bbb",
    "ids": [1,2,3],
    "detail": {
        "gender": "ccc",
        "location": "ddd",
        "ids": [4,5,6]
    }
})

然后我们收到了如下提示:

Required List parameter 'ids' is not present

但我们确实已经发送了 ids 参数,为什么没有获取到呢?这一点我们放到之后再谈,先试一下 multipart/form-data 的方式。

2.2.2 multipart/form-data

当然,采用这一方式,我们会收到同样的提示:

Required List parameter 'ids' is not present

2.2.3 参数接收到的问题

让我们在浏览器的开发者工具中看一看请求参数实际的样子:

不同于 PHP 框架 Laravel,@RequestParam 并不会将 ids[] 之类的数组类参数和 detail[xxx] 之类的嵌套参数进行重组。因而,控制器会认为收到了 ids[] 参数,而不是 ids 参数,同理也适用于嵌套参数。

那我们该怎么做的?我在 Stack Overflow 上得到了解答,我们可以采用以下方法之一:

  1. ids[] 改为 ids 传参,即 ids=1&ids=2&... 的方式( 注意对比上图 ),将嵌套类参数 detail[gender] 等改为 detail.gender
  2. 将嵌套参数采用 Map 类型接收。

注:在 Spring MVC 中,我们可以不书写 @RequestParam,直接使用相与请求参数同名的变量进行接收( 或直接使用一个 POJO 对象 ),但该方式也存在着与以上相同的问题。

2.3 文件上传问题

最开始已经说过,若要上传文件,在上述三种 Content-Type 中,只能使用 multipart/form-data,在注意到 2.2 中所提到的问题后,我们便可以通过 MultipartFile 类型的属性来获取到文件参数了。

3. 总结

从 Laravel 过渡到 Spring Boot,确实感到了在控制器层面二者的差异( 当然在 DAO 层更是如此 ),以下给出一个列表,用以纪念自己踩的坑:

参考链接

  1. postman中 form-data、x-www-form-urlencoded、raw、binary的区别 - CSDN博客
  2. http - What's the difference between "Request Payload" vs "Form Data" as seen in Chrome dev tools Network tab - Stack Overflow
  3. spring - What is difference between @RequestBody and @RequestParam? - Stack Overflow
  4. 浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别 - CSDN博客
查看原文

赞 5 收藏 5 评论 2

WensonSmith 关注了问题 · 2019-08-16

springmvc 以 form-data 方式请求时,嵌套参数如何绑定?

// Controller 代码

@RequestMapping(value = "/test", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public String test(User user) {
    return user.toString();
}
// 用于接收参数的类

@NoArgsConstructor
@Data
public class User {
    private String username;
    private String password;
    private Detail detail;

    @Data
    public class Detail {
        private String gender;
        private String location;

        public Detail() {
        }
    }
}
// 前端请求代码

$.post("http://localhost:8083/rrt/test", {
    "username": "aaaa",
    "password": "bbbb",
    "detail": {
        "gender": "male",
        "location": "Beijing"
    }
})

当这么发送数据时,后端就会报错:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'detail' of bean class [com.example.demo.param.User]: Could not instantiate property type [com.example.demo.param.User$Detail] to auto-grow nested property path; nested exception is java.lang.NoSuchMethodException: com.example.demo.param.User$Detail.<init>()] with root cause

在 application/json 发送时,采用 @ResponseBody 就可以正确的绑定嵌套参数;那么在 form-data 的请求方式中,该如何做呢?

关注 2 回答 0

WensonSmith 关注了专栏 · 2019-08-08

AlloyTeam 技术专栏

探索前端技术

关注 3757

认证与成就

  • 获得 32 次点赞
  • 获得 10 枚徽章 获得 0 枚金徽章, 获得 2 枚银徽章, 获得 8 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-03-31
个人主页被 615 人浏览