/ / Springboot - java.lang.IllegalStateException: Ani BindingResult, ani zwykły obiekt docelowy dla nazwy fasoli „user” dostępny jako atrybut żądania [duplicate] - spring, spring-mvc, thymeleaf, javabeans

Springboot - java.lang.IllegalStateException: Ani BindingResult, ani zwykły obiekt docelowy dla nazwy bean „użytkownik” dostępny jako atrybut żądania [duplikat] - wiosna, wiosna-mvc, thymeleaf, javabeans

Pojawia się następujący błąd:

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

Kiedy próbuję wywołać tę metodę:

@RequestMapping(value="/invite", method = RequestMethod.GET)
public ModelAndView showInvitePage(ModelAndView modelAndView,@ModelAttribute("user") User user){
return modelAndView;
}

to jest strona grasicy:

<div class="container">
<div class="wrapper">
<form class="form-activate" th:action="@{/invite}" method="post" th:object="${user}">
<h2 class="form-activate-heading">Nodig een student uit</h2>
<p>Vul hier het e-mailadres in van de student die je wil uitnodigen:</p>
<div class="form-group">
<input type="text" th:field="*{username}" class="form-control input-lg"
placeholder="Username" tabindex="1"/>
</div>
<div class="form-group">
<input type="text" th:field="*{email}" class="form-control input-lg"
placeholder="Username" tabindex="2"/>
</div>
<div class="row">
<div class="col-xs-6 col-sm-6 col-md-6">
<input type="submit" class="btn btn-secondary" value="Invite"/>
</div>
</div>
</form>
</div>

To dziwne, ponieważ mam inną metodę, która jest prawie kopią tej metody i działa tutaj doskonale:

@RequestMapping(value="/register", method = RequestMethod.GET)
public ModelAndView showRegistrationPage(ModelAndView modelAndView, @ModelAttribute User user){
return modelAndView;
}

i strona tymiankowa:

<div class="wrapper">
<form class="form-signin" th:action="@{/register}" method="post" th:object="${user}">
<h2 class="form-signin-heading">Registratie</h2>
<div class="form-group">
<input type="text" th:field="*{username}" class="form-control input-lg"
placeholder="Username" tabindex="1"/>
</div>
<div class="form-group">
<input type="text" th:field="*{email}" class="form-control input-lg"
placeholder="Email" tabindex="2"/>
</div>
<div class="form-group">
<input type="password" th:field="*{encryptedPassword}" id="password" class="form-control input-lg"
placeholder="Password" tabindex="3"/>
</div>
<div class="form-group">
<input type="password" name="password_confirmation" id="password_confirmation"
class="form-control input-lg" placeholder="Confirm Password" tabindex="4"/>
</div>

Jedyną rzeczą, o której mógłbym pomyśleć, jest to, że kiedy wywołujesz metodę zapraszania, użytkownik jest już zalogowany i faktycznie zaprasza. Podczas rejestracji żaden użytkownik nie jest jeszcze zalogowany.

EDYTOWAĆ:

Usunąłem thymeleaf th: field z pól wejściowych i zastosowałem klasyczny sposób i teraz działa dobrze.

<div class="form-group">
<input type="text" name="username" id="username" class="form-control input-lg"
placeholder="Username" tabindex="2"/>
</div>
<div class="form-group">
<input type="text" name="email" id="email" class="form-control input-lg"
placeholder="Email" tabindex="2"/>
</div>

Odpowiedzi:

1 dla odpowiedzi № 1

Otrzymujesz ten wyjątek, ponieważ nie ma user obiekt, z którym może wiązać się Spring. Więc dodaj jeden do modelu w swojej metodzie GET:

@GetMapping("/invite") //use shorthand
public String showInvitePage(Model model) {
model.addAttribute("user", new User()); //or however you are creating them
return "theFormNameWithoutTheExtension";
}

Wtedy Twój POST miałby przetwarzanie:

@PostMapping("/register")
public String showRegistrationPage(@ModelAttribute("user") User user) {
//do your processing
return "someConfirmationPage";
}