Search code examples
springthymeleafrequest-mapping

@PostMapping status 500 Error TemplateProcessingException and IllegalStatementException


I'm trying to create a simple page using Spring Boot where it simply displays the user input. But when I go to the @PostMapping path it gives me a status 500 error with these exceptions:

org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "greeting.html" - line 12, col 31)

2021-10-18 19:53:24.476 ERROR 9332 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "greeting.html" - line 12, col 31)] with root cause

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'greeting' available as request attribute

Here is my model:

package com.example.springplay;


public class Greeting {

    private long id;
    private String content;

    public long getId() {
        return id;
    }

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

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

}

Here is my controller:

package com.example.springplay;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
public class MainController {

//    @RequestMapping(value="/greeting", method = RequestMethod.GET)
    @GetMapping("/greeting")
    public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting.html";
    }

    @PostMapping("/greeting")
    public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {
        model.addAttribute("greeting", greeting);
        return "result.html";
    }
}

Here are my HTML pages: greeting.html


<!DOCTYPE HTML>
<html xmlns:th="https://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>
<p th:text="${name}"></p>
<form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
    <p>Id: <input type="text" th:field="*{id}" /></p>
    <p>Message: <input type="text" th:field="*{content}" /></p>
<!--    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>-->
    <button type="submit">Submit Your Post</button>
</form>
</body>
</html>

index.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>Get your greeting <a th:href="@{/greeting}">here</a></p>
</body>
</html>

result.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Result</h1>
<p th:text="'id: ' + ${greeting.id}" />
<p th:text="'content: ' + ${greeting.content}" />
<a href="/greeting">Submit another message</a>

</body>
</html>

Edit: I fixed it by adding the parameter "Greeting greeting" to public String greeting(), so it's like

@GetMapping("/greeting")
    public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Greeting greeting, Model model) {
        model.addAttribute("name", name);
        return "greeting.html";
    }

I don't know why that happens though, hope someone can explain


Solution

  • Could you try:

     @GetMapping("/greeting")
        public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Greeting greeting, Model model) {
            model.addAttribute("name", name);
            model.addAttribute("greeting", new Greeting());
            return "greeting.html";
        }