You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spring Boot与Thymeleaf从数据库填充下拉选择框时出现绑定异常的问题排查

解决Spring Boot + Thymeleaf中Select组件绑定的Bean缺失问题

你遇到的这个报错java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'skill' available as request attribute,核心原因是Thymeleaf的th:field指令需要页面绑定一个名为skill的实体对象,但你的控制器没有把这个对象添加到Spring Model中。下面是具体的修复步骤和优化建议:

步骤1:修复控制器,添加绑定用的skill对象

修改SkillController的skill方法,把空的Skill对象加入Model,这样Thymeleaf才能找到th:field对应的绑定目标:

@GetMapping("/skill")
public String skill(Model theModel) {
    // 新增:添加绑定用的Skill对象到Model,名称要和th:field里的*{skill.xxx}对应
    theModel.addAttribute("skill", new Skill());
    // 将现有技能列表添加到Spring模型中
    theModel.addAttribute("skills", skillService.getSkills());
    return "skill";
}

解释:th:field="*{skill.skillID}"中的skill是Model里的bean名称,必须确保Model里存在这个对象,否则Thymeleaf不知道要把选中的值绑定到哪里。

步骤2:优化Thymeleaf的Select标签写法

你的select标签可以调整得更规范,比如添加默认提示选项,并且确保option标签正确闭合(避免渲染异常):

<div class="form-group col-md-8">
    <label class="col-form-label">Category </label>
    <select id="category" name="category" th:field="*{skill.skillID}" class="form-control">
        <!-- 添加默认提示选项 -->
        <option value="">请选择技能</option>
        <option th:each="skill : ${skills}" 
                th:value="${skill.skillID}" 
                th:text="${skill.skillname}">
        </option>
    </select>
</div>

这里用th:text代替th:utext(如果你的skillname没有HTML内容,th:text更安全),同时给select加上样式类提升页面效果。

额外的优化建议

  • 简化依赖注入:Spring 4.3+支持构造方法注入时省略@Autowired,可以把SkillController的代码简化:
@Controller
public class SkillController {
    private final SkillService skillService;

    // 这里可以去掉@Autowired
    public SkillController(SkillService skillService) {
        this.skillService = skillService;
    }

    // ... 其他方法
}
  • 规范实体字段命名:你的实体里UserSkills字段首字母大写,建议改成小驼峰userSkills,符合Java命名规范,避免后续ORM操作可能出现的问题。
  • 验证数据获取:可以在skillService.getSkills()方法里加日志,确认确实从数据库拿到了数据:
@Override
public Iterable<Skill> getSkills() {
    Iterable<Skill> skills = skillRepository.findAll();
    System.out.println("获取到的技能列表:" + skills);
    return skills;
}

这样可以排查是否是数据获取的问题,而不是页面绑定的问题。

内容的提问来源于stack exchange,提问作者Minomx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:07:28