У меня есть форма с тремя входами выбора, которые добавляются из базы данных в представлении. Все в порядке, и пользователь может выбирать для каждого выбора. Проблема в том, что когда я отправляю форму, @ModelAttribute генерирует те же запросы, что и запрос GET (когда эти три выбора добавляются в представление), и в то же время поля выбора пусты после POST.
@GetMapping("/road-assistance")
public String viewPage(Model model, Locale locale) {
model.addAttribute("roadAssistanceDto", roadAssistanceService.createRoadAssistanceDto(locale, null));
return "admin/roadassistance/view";
}
@PostMapping("/road-assistance")
public String createRoadAssistance(Model model, Locale locale,
final @Valid @ModelAttribute("roadAssistanceDto") RoadAssistanceDto roadAssistanceDto,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "redirect:/";
}
return "admin/roadassistance/view";
}
Почему @PostMapping генерирует одни и те же запросы и в то же время у меня нет информации в представлении / модели?
вид -
<div class = "row card-pagging">
<div class = "col-sm-2 mt-3 offset-sm-2">
<label data-th-text = "#{control.panel.roadassistance.country}"
class = "control-label"
for = "country">Country</label>
<select id = "country" data-th-field = "*{country}" class = "form-control">
<option data-th-each = "countryList : ${roadAssistanceDto.countryList}"
data-th-value = "${countryList.id}"
data-th-text = "${countryList.countryI18n[#locale].name}"></option>
</select>
</div>
<div class = "col-sm-3 mt-3">
<label data-th-text = "#{control.panel.roadassistance.region}" class = "control-label"
for = "region">Region</label>
<select data-th-field = "*{region}" id = "region" class = "form-control">
<option value='' data-th-text = "#{control.panel.roadassistance.chooseregion}"></option>
<option data-th-each = "reg : ${roadAssistanceDto.regionList}" data-th-value = "${reg.id}"
data-th-text = "${reg.regionI18n[#locale].name}"></option>
</select>
</div>
<div class = "col-sm-3 mt-3">
<label data-th-text = "#{control.panel.roadassistance.city}" class = "control-label"
for = "region">City</label>
<select data-th-field = "*{city}" id = "city" class = "form-control">
<option value = "" data-th-text = "#{control.panel.roadassistance.chooseregion}"></option>
<option data-th-each = "city : ${roadAssistanceDto.cityList}" data-th-value = "${city.id}"
data-th-text = "${city.cityI18n[#locale].name}"></option>
</select>
</div>
</div>
И RoadAssistanceDto -
public class RoadAssistanceDto implements Serializable {
private Long id;
private Country country;
private Region region;
private City city;
private List<Country> countryList;
private List<Region> regionList;
private List<City> cityList;
/* GETTERS AND SETTERS /*
}
Хм ... Я думаю, что заметил проблему ... что-то работает, когда я привязываю поля в тимелеафе ... но в любом случае, почему генерируются эти запросы?
Добавьте код roadAssistanceDto!
@DariushJafari Готово
Разве вы не можете просто установить точку останова и проверить стек вызовов и посмотреть, почему происходит вызов. Даже если бы существовала какая-то документация, объясняющая, как именно @ModelAttribute, я все равно предпочел бы подход отладки - код никогда не лжет :) Если заглянуть в документацию, одной из возможностей может быть "An @ModelAttribute on a method argument indicates the argument should be retrieved from the model. If not present in the model, the argument should be instantiated first and then added to the model.".
Добавьте код просмотра (форму), пожалуйста!