gpt4 book ai didi

java - 模型属性被 thymeleaf 设置为 null

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:39 26 4
gpt4 key购买 nike

我一直在处理以下问题:

我有一个名为 User 的简单模型类。

public class User{

private Long id;
private String name;
...}

这是我的 Controller 代码:

@RequestMapping ( value = "/users", params = { "id" } )
public String showEditForm( final Model model, final HttpServletRequest req )
{
User edit = this.userRepository.findOne( Long.valueOf( req.getParameter( "id" ) ) );
model.addAttribute( "user", edit );
return "edit-user";
}


@RequestMapping ( value = "/users", method = RequestMethod.POST, params = {"edit"
})
public String editUser( @Valid @ModelAttribute ( "user" ) final User user,
final BindingResult bindingResult, final Model model )
{
if ( bindingResult.hasErrors() )
{
return "edit-user";
}

return "redirect:/users";
}

以下是显示所有用户的代码片段:

<div class="userlist" th:unless="${#lists.isEmpty(users)}">
<h2 th:text="#{list.user.title}"></h2>
<table>
<thead>
<tr>
<th th:text="#{name}" />
<th th:text="#{details}" />
</tr>
</thead>
<tbody>
<tr th:each="u : ${users}">
<td th:text="${u.name}" />
<td><a th:href="@{/users(id=${tc.id})}" th:text="#{edit}"></a></td>
</tr>
</tbody>
</table>
</div>

最后是提交表单:

<form action="#" th:action="@{/users}" th:object="${user}"
method="post">
<fieldset>
<ul th:if="${#fields.hasErrors('*')}" class="errorlist">
<li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li>
</ul>
<div>
<input type="text" th:field="*{id}"/>
</div>
<div>
<label for="name"> <span th:text="#{name}"></span>
</label> <input type="text" th:field="*{name}"
th:class=" ${#fields.hasErrors('name')}? 'fieldError'" />
</div>
<div class="submit">
<button type="submit" th:text="#{update}" name="edit"></button>
</div>
</fieldset>
</form>

现在问题描述:只要提交表单中存在“id”字段,一切正常。但是,如果我从提交表单中删除“id”字段,因为 id 属性不打算修改,工作流将不再工作。其实在editUser()方法中id为null。我假设如果提交表单中不存在,Thymeleaf 会将 id 属性的值设置为 null。但我不确定这一点。而且我认为除了必须让 id-property 驻留在提交表单中之外,这个问题必须有一些解决方案。

我希望任何人都可以在这里提供帮助。

谢谢。

爱德蒙

最佳答案

这与 Thymeleaf 无关,但与绑定(bind)的工作方式无关。 Spring 只会将属性绑定(bind)到在请求中作为参数出现的模型对象。如果您删除不存在的 ID,因此无法绑定(bind)(它应该绑定(bind)到什么?)。

对此的解决方案是将 id 指定为隐藏形式,以便它出现。或者在请求之间将您的对象存储在 session 中(在 Controller 上使用 @SessionAttributes),这样较早检索到的对象将用于绑定(bind)。

@Controller
@SessionAttributes("user")
public class UserController {

@ModelAttribute("user")
public User initUser(@RequestParam("id") Long id) {
return this.userRepository.findOne(id);
}

RequestMapping ( value = "/users", params = { "id" } )
public String showEditForm() {
return "edit-user";
}

@RequestMapping ( value = "/users", method = RequestMethod.POST, params = {"edit"})
public String editUser( @Valid @ModelAttribute ( "user" ) final User user, final BindingResult bindingResult, SessionStatus status;) {
if ( bindingResult.hasErrors() ) {
return "edit-user";
}
status.setComplete(); // Indicate we are done,so @SessionAttributes can be cleaned up
return "redirect:/users";
}

类似的东西应该在 session 之间保留用户,然后可以使用 SessionStatus 触发 session 属性的清理。

关于java - 模型属性被 thymeleaf 设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19764760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com