У меня проблема с сохранением записей в БД с помощью Spring-Mvc и Thymeleaf. Когда я нажимаю кнопку «Обновить» в записи, чтобы ввести форму обновления (прилагается ниже), все значения находятся на своем месте правильно, но, когда я хочу отправить, возникает ошибка. В консоли нет никакой трассировки стека, только ошибка на веб-странице, которую я не могу решить.
Это мой код:
контроллер:
@GetMapping("/{maltId}")
public ModelAndView showMalt(@PathVariable("maltId") Long maltId) {
ModelAndView mav = new ModelAndView("malt/malt-show");
mav.addObject(maltService.findById(maltId));
return mav;
}
@GetMapping("/{maltId}/edit")
public String initUpdateMaltForm(@PathVariable("maltId") Long maltId, Model model) {
model.addAttribute("malt", maltService.findById(maltId));
return VIEWS_MALT_CREATE_OR_UPDATE_FORM;
}
@PostMapping("/{maltId}/edit")
public String processUpdateMaltForm(@Valid Malt malt, BindingResult result, @PathVariable("maltId") Long maltId) {
if (result.hasErrors()) {
return VIEWS_MALT_CREATE_OR_UPDATE_FORM;
} else {
malt.setId(maltId);
Malt savedMalt = maltService.save(malt);
return "redirect:/malt/" + savedMalt.getId();
}
}
Модель:
@Column(name="malt_name")
private String maltName;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="producer_id")
private Producer producer;
@Column(name="malt_filling")
private int maltFilling;
@Column(name="malt_ebc")
private int maltEbc;
@Column(name="malt_usage")
private String maltUsage;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="country_id")
private Country country;
@ManyToMany(mappedBy="malts")
private Set<Batch> batches;
Это мнение:
<body>
<form th:object="${malt}" th:action="@{/malt/}" method="post">
<input type="hidden" th:field="*{id}" />
<label>Malt name:</label>
<input type="text" class="form-control" th:field="*{maltName}" />
<label>Producer:</label>
<input type="text" class="form-control"
th:field="*{producer.producerName}" />
<label>Country:</label>
<select class="form-control" th:field="*{country.id}">
<option value="0">Select country</option>
<option th:each="country : ${countries}"
th:value="${country?.id}"
th:text="${country?.countryName}">
</option>
</select>
<label>Malt filling:</label>
<input type="text" class="form-control"
th:field="*{maltFilling}" />
<label>Malt usage:</label>
<input type="text" class="form-control"
th:field="*{maltUsage}" />
<label>Malt EBC:</label>
<input type="number" class="form-control"
th:field="*{maltEbc}" />
<button class="submit-button" type="submit">Submit</button>
</form>
</body>
Когда я нажимаю кнопку « Submit
, я получаю эту ошибку:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed May 15 22:46:22 CEST 2019
There was an unexpected error (type=Not Found, status=404).
No message available
Я пробовал несколько разных подходов, но ничего не помогает, и, поскольку в консоли нет трассировки стека, я понятия не имею, что здесь не так.
Ссылка на репо: https://github.com/fangirsan/maruszka-new
Всего 1 ответ
Отсутствие трассировки 404 стека обычно указывает на то, что нет отображения. Поскольку вы, возможно, предоставили только часть вашего Controller
я предполагаю, что причиной этого является код на ваш взгляд здесь:
<form th:object="${malt}" th:action="@{/malt/}" method="post">
Действие выполняется для ("/malt/")
, однако ваш контроллер не получил сопоставления для этого ?! Я ожидаю, что это должно это исправить:
<form th:object="${malt}" th:action="@{${'/' + malt.id + '/edit'}}" method="post">
Обновить
Посмотрел ваш контроллер, и у вас есть следующие аннотации для вашего класса
@Controller
@RequestMapping("/malt")
public class MaltController{..
@RequestMapping("/malt")
теперь будет ../malt/{id}/edit'
путь для сохранения ../malt/{id}/edit'
. Код ниже теперь должен работать:
<form th:object="${malt}" th:action="@{${'/malt/' + malt.id + '/edit'}}" method="post">
Об использовании " @ {$ {...}} "
@ {} - переменная ссылки, содержимое этого тега будет добавлено к корневому контексту приложения, например, при переполнении стека @{'/posts'}
приведет к https://stackoverflow.com/posts
$ {} Является выражением переменной, которое будет возвращать значение String
или объекта .toString()
.
Если мы хотим передать переменную в переменную @{}
link, мы должны включить в нее переменную ${}
, что приведет к:
@{${'/hope/this/helps' + yourVariable}}