Thymeleaf + Spring:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性

Posted

技术标签:

【中文标题】Thymeleaf + Spring:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性【英文标题】:Thymeleaf + Spring: Neither BindingResult nor plain target object for bean name 'User' available as request attribute 【发布时间】:2020-01-20 20:06:57 【问题描述】:

当我想访问 myweb/register.html 时出现该错误 有人可以给我建议我做错了什么? 在 register.html 我已经突出显示 $User、*firstName、*lastName、*email 和 *password

Servlet.service() 用于 servlet [dispatcherServlet] 在上下文中的路径 [] 抛出异常 [请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateInputException:发生错误 在模板解析期间(模板:“类路径资源 [templates/register.html]")] 有根本原因

java.lang.IllegalStateException: 既不是 BindingResult 也不是普通的 bean 名称“用户”的目标对象可用作请求属性

控制器:

    @RequestMapping(value =  "/register" , method = RequestMethod.GET)
public ModelAndView register()
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("register"); // resources/templates/register.html
    return modelAndView;

注册.html:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Registration Form</title>
    <!-- link rel="stylesheet" type="text/css" th:href="@/css/registration.css" /-->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body style="background-color: #ededed;">
<div style="background-color: #337ab7; height: 50px;"></div>
<div class="container-fluid" style="margin-top: 30px;">

    <div class="row col-lg-4 col-lg-offset-4" style="margin-top: 40px; background-color: #fff; padding: 20px; border: solid 1px #ddd;">
        <form autocomplete="off" action="#" th:action="@/register" th:object="$User" method="POST" class="form-signin" role="form">
            <h3 class="form-signin-heading">Registration Form</h3>
            <div class="form-group">
                <div class="">
                    <input type="text" th:field="*firstName" placeholder="Name" class="form-control" />
                </div>
            </div>
            <div class="form-group">
                <div class="">
                    <input type="text" th:field="*lastName" placeholder="Last Name" class="form-control" />
                </div>
            </div>
            <div class="form-group">
                <div class="">
                    <input type="text" th:field="*email" placeholder="Email" class="form-control" />
                </div>
            </div>
            <div class="form-group">
                <div class="">
                    <input type="password" th:field="*password" placeholder="Password" class="form-control" />
                </div>
            </div>
            <div class="form-group">
                <div class="">
                    <button type="submit" class="btn btn-primary btn-block">Register User</button>
                </div>
            </div>
            <span th:utext="$successMessage"></span>
        </form>
    </div>
</div>
</body>
</html>

用户.java:

package roster.schedule.user;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import roster.schedule.role.Role;

import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "auth_user")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class User

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "auth_user_id")
    private int id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;

    @Column(name = "password")
    private String password;

    @Column(name = "technical")
    private byte technical;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "auth_user_role", joinColumns = @JoinColumn(name = "auth_user_id"), inverseJoinColumns = @JoinColumn(name = "auth_role_id"))
    private Set<Role> roles;


【问题讨论】:

您展示了一个控制器。您不会在其中的任何位置设置名为 User 的模型值。 【参考方案1】:

您必须将空的用户对象添加到模型中。

尝试以下操作:

    @RequestMapping(value =  "/register" , method = RequestMethod.GET)
public ModelAndView register()
    ModelAndView modelAndView = new ModelAndView();

    modelAndView.addObject("User", new User());

    modelAndView.setViewName("register"); // resources/templates/register.html
    return modelAndView;

【讨论】:

非常感谢!而已!我忘记了(不知道,我需要那个:D)关于这条线modelAndView.addObject("User", new User());

以上是关于Thymeleaf + Spring:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Thymeleaf 如何使用 EL 调用来自 Bean 的操作方法

Thymeleaf 内联 javascript spring bean 使用文本模板模式检查 null

Thymeleaf + Spring:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性

如何在 thymeleaf 中访问 Spring session bean 范围

Spring Boot / Thymeleaf / Hibernate:带有 Java 注解的 Sessionfactory Bean

Thymeleaf调用Springboot bean的方法