提交表单后,为什么模型不保存我的数据?

时间:2018-11-02 11:19:21

标签: java html spring-mvc

我的 Spring MVC 项目是一种交易服务,您拥有客户和交易列表。我也在使用Hibernate。我有这个客户面板,客户可以在其中查看他的余额,以前的交易,并能够进行新的交易。这是我的 .jsp 文件

的摘要

传递数据可以很好地传递,但是“ loggedClient”属性显示为空对象,其中 nulls 作为值传递。仅在单击 Submit (提交)按钮后才会发生这种情况,刷新网站时不会发生这种情况。解决此问题的关键可能是loggingClint.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";

}

2 个答案:

答案 0 :(得分:0)

我相信我现在看到了问题。发生的情况是JSP中的loggingClient不在表单内,因此在提交表单时,仅发送transferData中的内容。如果要发回LoggedClient片段,则需要将其折叠为transferData中的隐藏输入字段。

例如,在您的JSP中:

<form...>
    <form:hidden path="loggedClient.firstName" value="${loggedClient.firstName"/> 
    <form:hidden path="loggedClient.lastName" value="${loggedClient.lastName"/>
...
</form>

然后在您的控件中,删除loggingClient参数。更新您的TransferData类,使其包含一个loggingClient属性,您应该一切顺利。

答案 1 :(得分:0)

之所以会这样,是因为您的表单只有一个modelAttribute。 提交表单时,仅传递一个对象,即transferData。由于logedClient不属于表单,您将永远获得另一个null。

无论如何,即使您尝试将loggingClient作为表单输入参数传递,它也不会填充@ModelAttribute Client,因为表单已经有一个modelAttribute,上面写着“ transferData”,您不能在其中添加另一个。< / p>

如果要传递loggingClient信息,则必须更改方法。 我建议对sessionedClients使用会话,并且不要使用表单逐页传递它。

如果会话不是您的解决方案,则必须使用@ModelAttribute,而不是考虑在transferData内添加loggingClient的字段并将其作为输入参数添加到表单中(说实话,设计很糟糕,所以我不建议这个)