Spring Boot电商项目表单必填字段配置问题求助
解决Spring Boot商品表单必填校验失效问题
1. 修正POJO的校验注解
先把实体类的校验注解补全,不同类型字段用对应注解,别全用@NotNull:
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Min; public class Product { private Long id; @NotBlank(message = "商品名称不能为空") private String name; @NotBlank(message = "商品描述不能为空") private String description; @NotNull(message = "商品价格不能为空") @Min(value = 0, message = "价格不能为负数") private Double price; @NotNull(message = "库存数量不能为空") @Min(value = 0, message = "库存不能为负数") private Integer stock; // getter、setter、构造方法省略 }
- 字符串类型用
@NotBlank:会校验非null且不是空白字符串(比@NotNull更适合表单输入场景) - 数值类型用
@NotNull:确保字段不为null,再加@Min保证输入值合法
2. 修改Controller,触发校验并处理错误
在接收表单参数的方法里,必须加@Valid注解触发校验,同时绑定BindingResult捕获错误,这样就不会跳转到默认错误页面了:
import org.springframework.validation.BindingResult; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.stereotype.Controller; import javax.validation.Valid; @Controller public class ProductController { // 跳转到创建商品页面 @GetMapping("/products/create") public String showCreateForm(Product product) { return "create"; } // 提交创建商品请求 @PostMapping("/products/create") public String createProduct(@Valid Product product, BindingResult result) { // 如果校验有错误,返回表单页面 if (result.hasErrors()) { return "create"; } // 这里写入保存商品的业务逻辑 return "redirect:/products"; } // 跳转到编辑商品页面 @GetMapping("/products/edit/{id}") public String showEditForm(@PathVariable Long id, Model model) { // 查询对应商品并放入model Product product = productService.findById(id); model.addAttribute("product", product); return "edit"; } // 提交编辑商品请求 @PostMapping("/products/edit") public String updateProduct(@Valid Product product, BindingResult result) { if (result.hasErrors()) { return "edit"; } // 这里写入更新商品的业务逻辑 return "redirect:/products"; } }
关键:@Valid必须加在要校验的参数前,BindingResult要紧跟在校验参数后面,这样Spring才会把校验错误存入BindingResult,而不是直接抛出异常。
3. 前端页面显示错误提示
在create.html和edit.html的表单字段下方,添加错误提示,用Thymeleaf的校验表达式:
<!-- 商品名称字段示例 --> <div class="form-group"> <label for="name">商品名称</label> <input type="text" class="form-control" id="name" th:field="*{name}"> <span class="text-danger" th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span> </div> <!-- 商品价格字段示例 --> <div class="form-group"> <label for="price">商品价格</label> <input type="number" step="0.01" class="form-control" id="price" th:field="*{price}"> <span class="text-danger" th:if="${#fields.hasErrors('price')}" th:errors="*{price}"></span> </div>
这样校验失败时,页面会直接显示你在注解里定义的错误提示,不会跳转到默认错误页。
4. 确保pom.xml包含校验依赖
如果你的Spring Boot版本是2.3及以上,需要手动添加validation依赖(默认不再包含):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
为什么之前的方法没生效?
- 只加了
@NotNull但没加@Valid触发校验,Spring不会自动校验参数 - 没有绑定
BindingResult处理错误,校验失败时Spring会抛出MethodArgumentNotValidException,而你没处理这个异常,就会跳转到默认的Whitelabel Error Page
内容的提问来源于stack exchange,提问作者Sohaib
相关产品推荐
相关产品推荐

