<form method="post" action="/httpTest/postList2"> <input type="text" name="user[0].id" value="1"> <input type="text" name="user[0].userName" value="zhangsan"><br> <input type="text" name="user[1].id" value="2"> <input type="text" name="user[1].userName" value="lisi"><br> <button>提交</button> </form>@PostMapping("postList2") public String testPost2(@RequestParam("user") List<User> user) 报错400 Required List parameter 'user' is not present
时间: 2025-06-19 16:37:02 浏览: 12
### Spring Boot 中处理 `@PostMapping` 接收 `List<User>` 参数报 400 错误的原因
当在 Spring Boot 应用程序中使用 `@PostMapping` 注解来接收一个 `List<User>` 类型的参数时,如果客户端未正确传递数据或者服务器端配置不当时,可能会触发 HTTP 400 Bad Request 错误。此错误通常表示请求中的某些字段不符合预期。
以下是可能引发该问题的主要原因以及解决方案:
#### 原因分析
1. **前端发送的数据格式不匹配**
如果前端发送的是 JSON 数据,则需要确保其结构与后端期望的一致。例如,对于 `List<User>` 的情况,JSON 数组应被正确解析为 Java 列表对象[^2]。
2. **缺少必要的注解**
后端方法签名中如果没有适当标注 `@RequestBody` 或者其他必要注解,Spring 将无法自动绑定传入的 JSON 数据到目标列表变量上[^3]。
3. **Content-Type 配置不当**
客户端需设置正确的 Content-Type 头部信息(如 application/json),以便告知服务端如何解释接收到的内容[^4]。
4. **实体类 User 缺少无参构造函数或其他必需属性**
当序列化/反序列化过程中遇到异常时也可能抛出类似的错误消息;因此建议检查模型类定义是否满足 Jackson/Gson 等库的要求[^5]。
#### 解决方案示例代码
下面提供了一个完整的例子展示如何通过 POST 请求成功提交并接受一组用户记录:
```java
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> saveUsers(@RequestBody List<User> users){
System.out.println(users);
return new ResponseEntity<>("Users saved successfully", HttpStatus.OK);
}
}
// Assuming you have this simple POJO representing user details.
class User {
private String firstName;
private String lastName;
// Standard getters and setters along with default constructor are omitted here but should exist in actual implementation.
}
```
请注意,在上面的例子中我们采用了 `@RestController` 而非传统的 `@Controller` ,因为前者会默认返回响应体而不是试图渲染视图模板文件[^6]。
另外,请确认您的项目已经引入了支持 RESTful Web Services 功能所需的依赖项,比如 spring-boot-starter-web 。如果您正在构建 Maven 工程的话,那么应该像这样声明它作为一项依赖关系:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
```
最后提醒一下测试 API 可以借助 Postman 这样的工具来进行调试验证工作流程正常与否。
---
阅读全文
相关推荐





为什么<!DOCTYPE html> <html xmIns:th= "http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>User Form</title> </head> <body> User Form <form th:object="$[user]"th:action="@[/users/save]" method="post"> <input type"hidden" th:field="*(id)"> <label> Name:</label><input type="text" th:f¡eld="* [name]">
<label>Email:</label><input type="email" th:field="* [email]">
<input type="submit" value="Save"> </form> Back to User List</body> </html>

给下面代码增加分页功能,要求细致,逻辑清楚,<form action="./../selectNews" method="post"> <input type="text" name="key" id="key" placeholder="请输入标题"/> <input type="submit" value="查询"/> 发布新闻 返回主页 </form> 新闻编号 新闻标题 <%-- 新闻内容 --%> 新闻类别 发布人 发布时间 状态 是否头条 操作 <c:forEach items="${newslist}" var="u"> ${u.nid} ${u.title} <%-- ${u.content} --%> ${u.type} ${u.userName} ${u.pubTime} <c:choose> <c:when test="${u.state==0}">未审核</c:when> <c:when test="${u.state==1}">审核通过</c:when> <c:otherwise>未通过</c:otherwise> </c:choose> <c:choose> <c:when test="${u.top==0}">否</c:when> <c:otherwise>是</c:otherwise> </c:choose> <c:choose> <c:when test="${user.rule==1}"> 查看 修改 删除 审核 </c:when> <c:when test="${user.rule==0 && user.uid==u.uid}"> 查看 修改 删除 </c:when> <c:otherwise> 查看 </c:otherwise> </c:choose> </c:forEach>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2025/2/28
Time: 15:47
To change this template use File | Settings | File Templates.
--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生列表</title>
</head>
<body>
欢迎您,${name}
<form action="<%=request.getContextPath()%>/student/selectStudentAndGrade" method="post">
学生姓名:<input type="text" name="studentName" placeholder="请输入要搜索的学生姓名" value="${student.studentName}">
班级:<select name="gradeId">
<option value=>请输入班级</option>
<option value="1"<c:if test="${student.gradeId=='1'}">selected</c:if>>java1班</option>
<option value="2"<c:if test="${student.gradeId=='2'}">selected</c:if>>java2班</option>
<option value="3"<c:if test="${student.gradeId=='3'}">selected</c:if>>java3班</option>
<option value="4"<c:if test="${student.gradeId=='4'}">selected</c:if>>java4班</option>
</select>
<input type="submit" value="查询"> <input type="button" value="重置" onclick="resetQuery()">
</form>
</form>
<input type="button" value="新增" onclick="location.href='<%=request.getContextPath()%>/studentAdd.jsp'">
序号
学生姓名
年龄
出生日期
班级
<c:forEach items="${studentList}" var="tea" varStatus="sta">
${sta.count}
${tea.studentName}
${tea.age}
<%-- ${stu.birth} --%>
<fmt:formatDate value="${tea.birth}" pattern="yyyy-MM-dd"/>
${tea.grade.gradeName}
<%-- ${stu.grade.gradeName} --%>
修改
删除
</c:forEach>
</body>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-1.9.1.js"></script>
<script>
function resetQuery(){
$("input[type=text]").val("");
$('select').prop('selectedIndex',0);
}
</script>
</html>加css样式
搭建个人博客 ( YIDBlog )
(node+express+ejs+node+mongodb+mongoose)
(在这里认为大家已经知道如何用命令行创建node项目了,推荐用WebStorm快速创建)
实现以下简单的功能: (一些详细的表单验证先忽略)
用户注册
用户登录
用户登出
发表文章
编辑文章
删除文章
一. 配置路由
1.将目录下的 app.js 更改如下
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var app = express();
// 设置模板目录
app.set('views', path.join(__dirname, 'views'));
// 设置模板引擎为 ejs
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public')));
// 设置路由
routes(app);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('post'),function(){
console.log("Express server listening on port: " + 3000);
});
module.exports = app;
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2. 将routes下的index.js更改如下
module.exports = function(app){
app.get('/',function(req,res,next){
res.render('index',{
title:'首页',
});
}
AI写代码
javascript
运行
1
2
3
4
5
6
3. 在views中的index.ejs,代码如下:
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<%= title %>
Welcome to <%= title %>
</body>
</html>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
4. 运行项目,在浏览器输入:http://localhost:3000/
这样我们就很愉快就路由给配置好了。
接下来我们来一起搭建简单的界面,这里我用到bootstrap框架:
我们先在index.js中将要展示的界面进行路由的配置:
module.exports = function(app){
//首页
app.get('/',function(req,res,next){
res.render('index',{
title:'首页',
});
//注册界面
app.get('/reg',function(req,res,next){
res.render('reg',{
title:'注册',
});
//登录
app.get('/login',function(req,res,next){
res.render('login',{
title:'登录',
});
//发表文章
app.get('/post',function(req,res,next){
res.render('post',{
title:'发表文章',
});
}
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
*开始我们的界面设计了,用Ejs模板引擎的<%- include %> 来将相同的部分分离开
创建 header.ejs
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title><%= title %> - Blog</title>
<script src="/https/wenku.csdn.net/javascripts/bootstrap.min.js"></script>
<script src="/https/wenku.csdn.net/javascripts/jquery.min.js"></script>
</head>
<body>
YIDBlog
首页
注册
登录
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
创建 footer.ejs
</body>
</html>
AI写代码
javascript
运行
1
2
3
创建 首页- index.ejs
<%- include header %>
<form>
<input type="text" class="form-control" placeholder="SEARCH" name="keyword">
<input type="submit" value="搜索" class="btn btn-default" />
</form>
学习node.js
作者:小蚁
|
日期:2016-12-14
<%- include footer %>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
首页完成,显示效果如下:
创建 登录界面-login.ejs
<%- include header %>
<form class="form-horizontal" role="form" method="POST">
<label for="firstname" class="col-sm-2 control-label">用户名</label>
<input type="text" class="form-control" name="username" placeholder="输入用户名">
<label for="lastname" class="col-sm-2 control-label">密码</label>
<input type="password" class="form-control" name="password" placeholder="输入密码">
<input type="submit" class="btn btn-default" value="登录" />
</form>
<%- include footer %>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
登录页面 效果如下:
创建 注册界面-reg.ejs
<%- include header %>
<form class="form-horizontal" role="form" method="POST">
<label for="firstname" class="col-sm-2 control-label">用户名</label>
<input type="text" class="form-control" name="username" placeholder="输入用户名">
<label for="lastname" class="col-sm-2 control-label">密码</label>
<input type="password" class="form-control" name="password" placeholder="输入密码">
<label for="lastname" class="col-sm-2 control-label">重复密码</label>
<input type="password" class="form-control" name="password-repeat" placeholder="输入密码">
<label for="lastname" class="col-sm-2 control-label">邮箱</label>
<input type="text" class="form-control" name="email" placeholder="再次输入密码">
<input type="submit" class="btn btn-default" value="完成注册" />
</form>
<%- include footer %>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
登录页面 效果如下:
创建 发表文章界面-post.ejs
<%- include header %>
<form method="post" enctype="multipart/form-data">
<label for="name">标题:</label>
<input type="text" class="form-control" name="title" placeholder="输入标题">
<label for="name">文章</label>
<textarea class="form-control" name="article" rows="8"></textarea>
<input type="hidden" name="pv" value=0 >
<input type="submit" value="发表" class="btn btn-default"/>
</form>
<%- include footer %>
AI写代码
javascript
运行

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2025/2/28
Time: 15:47
To change this template use File | Settings | File Templates.
--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生列表</title>
</head>
<body>
欢迎您,${name}
<form action="<%=request.getContextPath()%>/student/selectStudentAndGrade" method="post">
学生姓名:<input type="text" name="studentName" placeholder="请输入要搜索的学生姓名" value="${student.studentName}">
班级:<select name="gradeId">
<option value=>请输入班级</option>
<option value="1"<c:if test="${student.gradeId=='1'}">selected</c:if>>java1班</option>
<option value="2"<c:if test="${student.gradeId=='2'}">selected</c:if>>java2班</option>
<option value="3"<c:if test="${student.gradeId=='3'}">selected</c:if>>java3班</option>
<option value="4"<c:if test="${student.gradeId=='4'}">selected</c:if>>java4班</option>
</select>
<input type="submit" value="查询"> <input type="button" value="重置" onclick="resetQuery()">
</form>
</form>
<input type="button" value="新增" onclick="location.href='<%=request.getContextPath()%>/studentAdd.jsp'">
序号
学生姓名
年龄
出生日期
班级
<c:forEach items="${studentList}" var="tea" varStatus="sta">
${sta.count}
${tea.studentName}
${tea.age}
<%-- ${stu.birth} --%>
<fmt:formatDate value="${tea.birth}" pattern="yyyy-MM-dd"/>
${tea.grade.gradeName}
<%-- ${stu.grade.gradeName} --%>
修改
删除
</c:forEach>
</body>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-1.9.1.js"></script>
<script>
function resetQuery(){
$("input[type=text]").val("");
$('select').prop('selectedIndex',0);
}
</script>
</html>加css样式


搭建个人博客 ( YIDBlog )
(node+express+ejs+node+mongodb+mongoose)
(在这里认为大家已经知道如何用命令行创建node项目了,推荐用WebStorm快速创建)
实现以下简单的功能: (一些详细的表单验证先忽略)
用户注册
用户登录
用户登出
发表文章
编辑文章
删除文章
一. 配置路由
1.将目录下的 app.js 更改如下
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var app = express();
// 设置模板目录
app.set('views', path.join(__dirname, 'views'));
// 设置模板引擎为 ejs
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public')));
// 设置路由
routes(app);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('post'),function(){
console.log("Express server listening on port: " + 3000);
});
module.exports = app;
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2. 将routes下的index.js更改如下
module.exports = function(app){
app.get('/',function(req,res,next){
res.render('index',{
title:'首页',
});
}
AI写代码
javascript
运行
1
2
3
4
5
6
3. 在views中的index.ejs,代码如下:
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<%= title %>
Welcome to <%= title %>
</body>
</html>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
4. 运行项目,在浏览器输入:http://localhost:3000/
这样我们就很愉快就路由给配置好了。
接下来我们来一起搭建简单的界面,这里我用到bootstrap框架:
我们先在index.js中将要展示的界面进行路由的配置:
module.exports = function(app){
//首页
app.get('/',function(req,res,next){
res.render('index',{
title:'首页',
});
//注册界面
app.get('/reg',function(req,res,next){
res.render('reg',{
title:'注册',
});
//登录
app.get('/login',function(req,res,next){
res.render('login',{
title:'登录',
});
//发表文章
app.get('/post',function(req,res,next){
res.render('post',{
title:'发表文章',
});
}
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
*开始我们的界面设计了,用Ejs模板引擎的<%- include %> 来将相同的部分分离开
创建 header.ejs
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title><%= title %> - Blog</title>
<script src="/https/wenku.csdn.net/javascripts/bootstrap.min.js"></script>
<script src="/https/wenku.csdn.net/javascripts/jquery.min.js"></script>
</head>
<body>
YIDBlog
首页
注册
登录
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
创建 footer.ejs
</body>
</html>
AI写代码
javascript
运行
1
2
3
创建 首页- index.ejs
<%- include header %>
<form>
<input type="text" class="form-control" placeholder="SEARCH" name="keyword">
<input type="submit" value="搜索" class="btn btn-default" />
</form>
学习node.js
作者:小蚁
|
日期:2016-12-14
<%- include footer %>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
首页完成,显示效果如下:
创建 登录界面-login.ejs
<%- include header %>
<form class="form-horizontal" role="form" method="POST">
<label for="firstname" class="col-sm-2 control-label">用户名</label>
<input type="text" class="form-control" name="username" placeholder="输入用户名">
<label for="lastname" class="col-sm-2 control-label">密码</label>
<input type="password" class="form-control" name="password" placeholder="输入密码">
<input type="submit" class="btn btn-default" value="登录" />
</form>
<%- include footer %>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
登录页面 效果如下:
创建 注册界面-reg.ejs
<%- include header %>
<form class="form-horizontal" role="form" method="POST">
<label for="firstname" class="col-sm-2 control-label">用户名</label>
<input type="text" class="form-control" name="username" placeholder="输入用户名">
<label for="lastname" class="col-sm-2 control-label">密码</label>
<input type="password" class="form-control" name="password" placeholder="输入密码">
<label for="lastname" class="col-sm-2 control-label">重复密码</label>
<input type="password" class="form-control" name="password-repeat" placeholder="输入密码">
<label for="lastname" class="col-sm-2 control-label">邮箱</label>
<input type="text" class="form-control" name="email" placeholder="再次输入密码">
<input type="submit" class="btn btn-default" value="完成注册" />
</form>
<%- include footer %>
AI写代码
javascript
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
登录页面 效果如下:
创建 发表文章界面-post.ejs
<%- include header %>
<form method="post" enctype="multipart/form-data">
<label for="name">标题:</label>
<input type="text" class="form-control" name="title" placeholder="输入标题">
<label for="name">文章</label>
<textarea class="form-control" name="article" rows="8"></textarea>
<input type="hidden" name="pv" value=0 >
<input type="submit" value="发表" class="btn btn-default"/>
</form>
<%- include footer %>
AI写代码
javascript
运行










