Thymeleaf下拉选择保存Car实体时marka字段无默认值该如何解决
问题修复方案
错误原因
出现Field 'marka' doesn't have a default value报错的核心原因是下拉框的表单值没有正确绑定到Car实体的marka字段,导致持久化时关联字段为空触发数据库非空约束。
分步修改
1. 修改Thymeleaf页面下拉框代码
原下拉框存在3处错误:绑定字段错误、遍历集合错误、选项值配置错误,修改后代码如下:
<div class="form-group blu-margin"> <label class="form-label"> MARKA </label> <!-- th:field要绑定car对象的marka属性,用*{}语法 --> <select class="form-control" th:field="*{marka}" id="dropOperator" required> <!-- 未选择时值为空,避免非法id提交 --> <option value="">select brand</option> <!-- 遍历控制器传入的listbrand集合,value存品牌id --> <option th:each="brand : ${listbrand}" th:value="${brand.id}" th:text="${brand.brandName}"></option> </select> </div>
2. 配置Spring MVC对象转换器(可选,推荐)
如果希望Spring自动将提交的品牌id转为Brand对象绑定到car的marka字段,需要添加转换器:
@Component public class StringToBrandConverter implements Converter<String, Brand> { @Autowired private BrandService brandService; @Override public Brand convert(String source) { if (source == null || source.isEmpty()) { return null; } Long id = Long.parseLong(source); return brandService.get(id); } }
3. 简化save接口逻辑
不需要从Model中手动取参数,@ModelAttribute会自动完成属性绑定,修改后代码:
@RequestMapping(value = "/save", method = RequestMethod.POST) public String saveCar(@ModelAttribute("car") Car car, BindingResult bindingResult) { // 可选:校验marka是否为空,避免空值保存 if (car.getMarka() == null) { bindingResult.rejectValue("marka", "error.marka", "请选择品牌"); // 校验不通过返回新增页面,可自行补充参数回显逻辑 return "new"; } carService.save(car); return "redirect:/"; }
如果不想配置转换器,也可以选择更简单的绑定方式:将页面下拉框的th:field改成*{marka.id},直接保存car对象即可,JPA会自动根据id关联已持久化的Brand实体。
内容的提问来源于stack exchange,提问作者Emre Varol
相关产品推荐
相关产品推荐

