使用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
我尝试了几种不同的方法,但是没有任何帮助,并且由于控制台中没有stacktrace,所以我不知道这里出了什么问题。
答案 0 :(得分: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'
的路径。现在,下面的代码应该可以工作了:
<form th:object="${malt}" th:action="@{${'/malt/' + malt.id + '/edit'}}" method="post">
使用“ @ {$ {...}} ”时
@ {}是一个链接变量,此标记中的内容将附加到应用程序的根上下文中,例如,在堆栈溢出时,@{'/posts'}
将产生https://stackoverflow.com/posts
$ {}是一个变量表达式,它将返回String
或对象的.toString()
值。
如果我们想在@{}
链接变量中传递变量,则必须在其中包含${}
变量,从而导致:
@{${'/hope/this/helps' + yourVariable}}