Ошибка тимелеафа: org.springframework.expression.spel.spelevaluationexception

что ожидается

после привязки данных веб-страница должна отражать данные

Детали

Controller code

@Controller
@Configuration
@Component
public class Controller {

    @Autowired
    Credentials c;

    @GetMapping("/greeting")
    public String greetingForm(Model model) {
        model.addAttribute("greeting", new RequestData());
        return "greeting";
    }

    @PostMapping("/greeting")

    public String greetingSubmit(@ModelAttribute RequestData greeting) {
        if (c.getUserName().equals(greeting.getId()) && c.getPassword().equals(greeting.getContent()))
        {
        return "result";
        }
        else
        {
            return "error";
        }
    }
}

RequestData.java

public class RequestData {

    private String id;
    private String content;

    public String getId() {
        return id;
    }

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

    public String getContent() {
        return content;
    }

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

}

Credentials.java

@Component
@Configuration
@PropertySource("classpath:application.properties")
public class Credentials {

    public String userName;
    public String password;

     @Autowired
     private Environment env;

    @Autowired
    public String getUserName() {

         return env.getProperty("spring.username");

            }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Autowired
    public String getPassword() {
         return env.getProperty("spring.password");

            }

    public void setPassword(String password) {
        this.password = password;
    }


}

result.html

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

может скомпилировать, упаковать кодовую базу и собрать банку. однако, когда я запускаю файл jar, появляется следующая ошибка:

2018-10-31 15:36:34.259 ERROR 8220 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[disp
atcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context
 with path [] threw exception [Request processing failed; nested exception is or
g.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringE
L expression: "greeting.id" (template: "result" - line 9, col 8)] with root caus
e

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property o
r field 'id' cannot be found on null

Я не уверен, в чем проблема, документ тимелеафа говорит, что к атрибутам модели можно получить доступ с помощью $ {attributeName}, и я также использую то же самое, но тогда почему он говорит, что "id не может быть найден"

пожалуйста предложите

Вы уверены, что вызывается метод приветствияForm?

user10527814 31.10.2018 11:42
0
1
587
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я цитирую из Spring mvc doc:

What happens when a model attribute name is not explicitly specified? In such cases a default name is assigned to the model attribute based on its type. For example if the method returns an object of type Account, the default name used is "account". You can change that through the value of the @ModelAttribute annotation. If adding attributes directly to the Model, use the appropriate overloaded addAttribute(..) method - i.e., with or without an attribute name.

В твоем случае,

@PostMapping("/greeting")
public String greetingSubmit(@ModelAttribute("greeting) RequestData greeting) {
..
}

Другие вопросы по теме