SpringMVC 前端数据传一个对象的值

这两天在写SpringMVC,从前端传入一个对象的各个属性的值时,后端对象没有接收到值,debug了很久。

首先写了一个实体类User

如下:

1
2
3
4
5
6
7
8
package com.luo.pojo;

public class User {
public String name;
public int age;
public int id;
}

然后是一个简单的控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.luo.controller;

import com.luo.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

@RequestMapping("/user")
public String hello(User user){
System.out.println(user.toString());
System.out.println(user.age);
System.out.println(user.id);
System.out.println(user.name);
return "hello";
}
}

利用Tomcat部署后,在本地请求http://localhost:8080/luo/user?age=15&name=luo&id=10

后端获取的结果为:

age=0
id=0
name=Null

debug了一晚上,结果发现是自己看教程的时候太粗心了居然没有写set方法,果然写了set方法后成功解决,获取到了对应的值。

因此猜想从前端传值的注入方式是set方法注入,又想起Spring Bean对象注入的方式有set方法注入构造器方式注入,好奇心所以想试一下能否通过构造函数注入,于是在User类中添加了全参构造函数

1
2
3
4
5
6
public User(String name, int age, int id) {
System.out.println("调用了有参构造函数");
this.name = name;
this.age = age;
this.id = id;
}

发现使用构造器函数注入也可以完成对前端传入数据的接收!。

然后好奇心又来了,如果构造函数set方法同时存在,SpringMVC会优先调用哪种注入方式呢?

测试发现SpringMVC居然先调用了构造函数,如果对应的属性的set方法存在,还会接着调用该属性对应的set方法

然后好奇心又又又来了,如果不是全参构造函数,只是部分参数的构造函数,还可以正常的注入吗?

于是写了name和age的构造函数,id字段保留set方法

1
2
3
4
5
6
7
8
9
10
public User(String name, int age) {
System.out.println("调用了两个参数的构造函数");
this.name = name;
this.age = age;
}

public void setId(int id) {
System.out.println("setId");
this.id = id;
}

结果发现同时调用了两个参数的构造函数和setId方法,可以正常的识别到传入的数据和进行注入,用法还是挺灵活的。

em,没有好奇心了~

文章作者: luo
文章链接: https://luo41.top/2022/01/03/SpringMVC-前端数据传一个对象的值/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 luo's Blog