无法在null

时间:2017-09-22 22:38:52

标签: java spring-mvc spring-boot thymeleaf

尝试将表单提交上的变量传递给结果页面,但每次都返回null。无论我尝试了多少变化。

所以我为login.html映射get和post:

 @GetMapping("/login")
 public String greetingForm(Model model) {
    model.addAttribute("User2", new User());
    return "login";
}
@PostMapping("/login")
public String greetingSubmit(@ModelAttribute User regUser) {
    //userRepository.save(regUser);
    //String teststr = regUser.getName();
    //System.out.println(teststr);
    return "result";
}

实际的Login.html如下所示:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handling Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Form</h1>
    <form action="#" th:action="@{/demo/login}" th:object="${User2}" method="post">
        <p>Username: <input type="text" th:field="*{name}" /></p>
        <p>Password: <input type="text" th:field="*{password}" /></p>
        <p>Balance: <input type="text" th:field="*{balance}" /></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>
</body>
</html>

User.java文件的一部分:

@Entity // This tells Hibernate to make a table out of this class
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    private String name;

    private String password;

    private int balance;

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

并且result.html是:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handling Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Result</h1>
    <p th:text="'username: ' + ${User.name}" />
    <p th:text="'password: ' + ${regUser != null ? regUser.password : 'NOT FOUND'}" />
    <p th:text="'balance: ' + ${model != null ? regUser.balance : 'NOT FOUND'}" />
    <a href="/demo/login">Submit another user?</a>
</body>
</html>

它会在此行上反复抛出空错误:

<p th:text="'username: ' + ${User.name}" />

具体为${User.name},看起来像

  

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'name' cannot be found on null

所以我已经尝试了我能想到的一切,

${User2.name}
${User}
${User2}
${regUser.name}
${teststr}
${#User.name}

等...

如果我取消注释System.out.println(regUser.getName());,这很奇怪 它会很好地打印用户名,但不会传递该变量。它是我的占位符还是不能作为th:text传递,因为它是User对象?请帮助我非常困惑!

编辑:我遵循的教程(https://spring.io/guides/gs/handling-form-submission/) 如果你复制教程它工作得很好,但它只传递一个字符串。虽然User.name是一个字符串变量......

1 个答案:

答案 0 :(得分:0)

@ModelAttribute有一个名为name的元素。它的javadoc陈述

  

要绑定到的模型属性的名称。

     

默认模型属性名称是从声明的推断出来的   属性类型(即方法参数类型或方法返回类型),   基于不合格的类名:例如课程"orderAddress"   "mypackage.OrderAddress""orderAddressList"   "List<mypackage.OrderAddress>"

由于您为此元素提供了值,因此Spring MVC使用默认值。如上所述,默认值是从参数类型推断出来的,即User。如果您按照示例操作,则该属性名称将为user,而不是User

您的占位符应为​​

 ${user.name}

Spring参考文档here

中也对此进行了解释
  

未明确指定模型属性名称时会发生什么?   在这种情况下,默认名称将分配给基于模型属性   在它的类型。例如,如果方法返回类型的对象   Account,使用的默认名称为"account"。你可以改变它   通过@ModelAttribute注释的值。如果加入   直接归属于Model,使用适当的重载   addAttribute(..)方法 - 即带或不带属性名称。

@GetMapping中,您明确设置了模型属性的名称

model.addAttribute("User2", new User());

您也可以为@PostMapping示例执行此操作

@PostMapping("/login")
public String greetingSubmit(@ModelAttribute(name = "User") User regUser) {