Spring Boot Thymeleaf SpelEvaluationException EL1007E при отправке формы - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь обработать отправку формы с помощью thymeleaf в моем приложении с весенней загрузкой, я интегрировал
этот пример , который отлично работал в моем приложении. Я пытаюсь немного его изменить, но это то, что я получаю как исключение :

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'recruiter' cannot be found on null
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:213) ~[spring-expression-5.2.3.RELEASE.jar:5.2.3.RELEASE]

...

Это объект, с которым я пытаюсь справиться thymeleaf


public class FormRec {

private String recruiter;
public String getRecruiter() {
    return recruiter;
}
public void setRecruiter(String recruiter) {
    this.recruiter = recruiter;
}


}

Это мой 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 com.service.minimicroservice.objects.FormRec;

@Controller
public class MyController {




      @GetMapping("/form")
      public String greetingForm(Model model) {
        model.addAttribute("recForm", new FormRec());
        return "form";
      }

      @PostMapping("/form")
      public String greetingSubmit(@ModelAttribute FormRec rec) {
        return "result";
      }


}

result.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>Result</h1>
    <p th:text="'Recruiter: ' + ${rec.recruiter}" />
    <a href="/form">Submit another message</a>
</body>
</html>

часть form.html


<body>

                    <form action="#" th:action="@{/form}" th:object="${recForm}" method="post">
                        <div class="form-row m-b-55">
                            <div class="name">Recruiter<br> Name</div>
                            <div class="value">
                                <div class="row row-space">
                                    <div class="col-2">
                                        <div class="input-group-desc">
                                            <input class="input--style-5" type="text" name="first_name" th:field="*{recruiter}">
                                            <label class="label--desc">Full Name</label>
                                        </div>
                                    </div>
...


Чтобы сослаться на FormRec объект, я использую recForm как th:object в form.html и rec для ссылки на него в result.html.

Примечание. Я передаю значение входному тексту th:field="*{recruiter}" при отправке формы ( не равно нулю )

1 Ответ

1 голос
/ 23 января 2020

Вы должны указать ModelAttribute rec, с которым связаны данные. Так что в вашем методе контроллера сделайте это (обратите внимание на name = "rec"):

public String greetingSubmit(@ModelAttribute(name = "rec") FormRec rec) {
...
}

Это должно работать.

Дополнительное объяснение:

I Мы более подробно рассмотрели, почему это происходит, и это потому, что аннотация Spring по умолчанию ModelAttribute выводится из имени типа , а не из имени параметра (приведенная вами ссылка на пример говорит, что это параметр метода имя, но оно кажется неправильным).

Таким образом, в этом случае Spring отправляет formRec (обратите внимание на camelCase, который он ожидает, когда имя класса называется FormRec), а не rec, как и следовало ожидать.

Если мое объяснение на самом деле не имеет смысла, то это документация Spring на ModelAttribute:

Имя атрибута модели по умолчанию выводится из объявленного типа атрибута (т. Е. Типа параметра метода или типа возврата метода) на основе неквалифицированного имени класса: например, «orderAddress» для класса «mypackage.OrderAddress» или «orderAddressList» для «Список».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...