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

Spring整合Thymeleaf表单开发报错:模板解析500异常求助

解决Thymeleaf表单提交到Spring Controller的500错误:找不到'routetest'请求属性

我来帮你拆解下这个问题的根源,然后一步步修正代码:

核心错误原因

你遇到的java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'routetest' available as request attribute错误,本质是Thymeleaf表单绑定的对象和字段不匹配,再加上Controller没有提前把绑定对象放入模型,导致模板解析失败。

具体问题点&修正方案

1. Thymeleaf表单的绑定对象与字段不匹配

你在表单里设置了th:object="${route}",说明表单要绑定的是名为route的Route对象,但th:field却写了*{routetest.name}——这里的routetest是不存在的,应该直接使用Route实体类的字段名,因为*{...}是相对于th:object指定的对象的字段。

2. Controller的GetMapping方法未提供绑定对象

Thymeleaf需要在渲染表单时,从请求属性中拿到绑定的对象(也就是Route实例),否则会找不到目标对象报错。你原来的GetMapping方法没有把Route对象放入模型中,这是关键问题之一。

3. Controller的PostMapping方法有语法错误

你在打印语句里写了System.out.println(routetest.getName());,但routetest根本没定义,应该用方法参数里的route对象。

4. 实体类的final字段导致绑定失败

Route类里的name和grade是final字段,@Data注解不会为final字段生成setter方法,Spring无法通过反射设置这些字段的值,表单提交后数据无法绑定到对象上。


修正后的完整代码

修正后的Controller类

package climb.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import climb.entity.Route;

@Controller
@RequestMapping("/addRoute")
public class AddRouteController {

    @GetMapping
    public String showAddRoute(Model model) {
        // 把空的Route对象添加到模型中,供Thymeleaf进行表单绑定
        model.addAttribute("route", new Route());
        return "addRoute";
    }

    @PostMapping
    public String addRoute(@ModelAttribute Route route) {
        System.out.println("Route was added");
        // 使用方法参数中的route对象,而不是未定义的routetest
        System.out.println("Route name: " + route.getName());
        System.out.println("Route grade: " + route.getGrade());
        return "redirect:/";
    }
}

修正后的Thymeleaf表单

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Route database</title>
</head>
<body>
<h1>Add route</h1>
<form method="POST" th:object="${route}" th:action="@{/addRoute}">
    <h4>Enter your route</h4>
    <label for="name">Route name</label>
    <!-- 直接对应Route类的name字段 -->
    <input type="text" th:field="*{name}" id="name"/>
    
    <label for="grade">Route grade</label>
    <!-- 用下拉框代替文本输入,避免用户输入枚举外的无效值 -->
    <select th:field="*{grade}">
        <option th:each="grade : ${T(climb.entity.Route.Grade).values()}" 
                th:value="${grade}" 
                th:text="${grade}"></option>
    </select>
    
    <button type="submit">Submit</button>
</form>
<p><a href="/">Home</a></p>
</body>
</html>

修正后的Route实体类

package climb.entity;

import javax.persistence.Id;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;

@Data
@RequiredArgsConstructor
@NoArgsConstructor(access = AccessLevel.PUBLIC, force = true)
public class Route {
    @Id
    private long id;
    // 去掉final修饰符,让@Data生成setter方法,Spring才能绑定表单数据
    private String name;
    private Grade grade;
    // private Date createdAt;

    public enum Grade { _7A, _7B, _7C, _8A, _8B, _8C }
}

额外优化建议

  • 可以给Route字段添加JSR-380验证注解(比如@NotBlank),确保提交的数据符合业务要求,同时在页面上展示错误提示。
  • 如果需要保留name和grade的final修饰符,需要添加包含这两个字段的构造方法,并让Spring通过构造方法进行数据绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:17:43