java - 为什么模型在提交表单后不保存我的数据?
问题描述
我的Spring MVC项目是一种事务服务,您可以在其中拥有客户和事务列表。我也在使用休眠。我有这个客户面板,客户可以在其中看到他的余额、以前的交易并能够进行新的交易。这是我的.jsp文件的片段
传输数据传递得很好,但“loggedClient”属性显示为一个空对象,空值作为值传递。这仅在单击提交按钮后发生,刷新站点时不会发生。解决这个问题的关键可能是loggedClint.toString() 它返回:
Client [id=0, firstName=null, lastName=null, email=null, balance=0]
任何想法为什么会发生这种情况?我该如何解决这个问题,所以在提交交易后,我的“loggedClient”属性仍然充满了客户的数据?
<div id="wrapper">
<div id="header">
<h2>Welcome ${loggedClient.firstName} ${loggedClient.lastName}</h2>
</div>
<header><label class="balancelabel" > Balance: ${loggedClient.balance} </label></header>
</div>
<br><br>
<fieldset>
<legend>Transfer Money</legend>
<form:form action="transferMoney" modelAttribute="transferData" >
<table>
<tbody>
<tr>
<td><label>Recipients Email:</label></td>
<td><form:input path="mail" /></td>
</tr>
<tr>
<td><label>Amount :</label></td>
<td><form:input path="amount" /></td>
</tr>
<tr>
<td><label></label></td>
<td><input type="submit" value="Send Transfer" class="save" /></td>
</tr>
</tbody>
</table>
</form:form>
</fieldset><div id="container">
<div id="content">
<table>
<tr>
<th>From</th>
<th>To</th>
<th>Amount</th>
<th>Timestamp</th>
<!-- <th></th> -->
</tr>
<c:forEach var="tempTransfer" items="${transferList}">
<tr>
<td>${tempTransfer.sender.lastName}</td>
<td>${tempTransfer.receiver.lastName}</td>
<td>${tempTransfer.amount}</td>
<td>${tempTransfer.timestamp}</td>
</tr>
</c:forEach>
</table>
</div>
这是控制器代码片段:
@PostMapping("/transferMoney")
public String processTransfer(@ModelAttribute("loggedClient") Client loggedClient, @ModelAttribute("transferData") TransferDataContainer transferData, Model model) {
Client recipient = clientService.getClient(transferData.getMail());
System.out.println(loggedClient.toString());
if(transferData.getAmount() > loggedClient.getBalance()) {
System.out.println("You cannot send more than you have");
//System.out.println("You were trying to send : " + transferData.getAmount() +" but you have " + loggedClient.getBalance());
} else if(recipient==null) {
System.out.println("Invalid recepient");
} else {
int amount = transferData.getAmount();
// Updating data
loggedClient.setBalance(loggedClient.getBalance()-amount);
recipient.setBalance(recipient.getBalance()+amount);
Transfer transfer = new Transfer(amount, new Timestamp(System.currentTimeMillis()) , loggedClient, recipient);
clientService.saveClient(loggedClient);
clientService.saveClient(recipient);
transferService.saveTransfer(transfer);
}
return "client-logged";
}
解决方案
发生这种情况是因为您的表单只有一个 modelAttribute。当您提交表单时,仅传递一个对象,即 transferData。由于loggedClient 不是表单的一部分,您将永远得到另一个null。
无论如何,即使您尝试将loggedClient 作为表单输入参数传递,它也不会填充@ModelAttribute 客户端,因为表单已经有一个modelAttribute,它说“transferData”,您不能在那里添加另一个。
如果要传递记录的客户端信息,则必须更改方法。我建议对记录的客户端使用会话,并且不要使用表单逐页传递它。
如果 session 不是你的解决方案,你必须使用 @ModelAttribute ,而不是考虑在 transferData 中添加loggedClient的字段并将它们作为输入参数添加到表单中(老实说设计很糟糕,所以我不建议这样做)
推荐阅读
- intel - Intel 8086 CPU 的 20 位地址中如何存储 16 位数据?
- android - 不同页面中的数据库内容像相同的布局
- android - 当活动进入全屏模式时,如何阻止布局改变大小?
- java - 从 getOnKeyPressed 处理 EventHandler
- docker - 使用多个标签标记 docker 图像
- php - PHP 版本 7.1.21、XAMPP 中未启用 Xdebug
- go - 更改函数中的结构字段或返回值
- ms-access - 很难理解 MS Access 后端技术
- npm - 使用 Vue CLI 3 安装 Vuetify 后编译失败
- python - 如何删除某些类型的django中的记录?