Почему модель не сохраняет мои данные после отправки формы? - PullRequest
0 голосов
/ 02 ноября 2018

Мой Spring MVC проект - это своего рода сервис транзакций, где у вас есть клиенты и список транзакций. Я также использую Hibernate. У меня есть панель клиента, в которой клиент видит свой баланс, предыдущие транзакции и может выполнять новые транзакции. Вот фрагмент моего .jsp файла

Передача данных передается просто отлично, но атрибут «loggedClient» отображается как пустой объект с нулями , передаваемыми в качестве значений. Это происходит только после нажатия кнопки Submit и не происходит при обновлении сайта. Ключом к решению этой проблемы может быть 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";

}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Это происходит потому, что ваша форма имеет только один атрибут модели. При отправке формы передается только один объект, который является TransferData. Вы навсегда получите другой ноль из-за того, что loggedClient не является частью формы.

В любом случае, даже если вы попытаетесь передать loggedClient в качестве входных параметров формы, он не будет заполнять клиент @ModelAttribute, потому что форма уже имеет атрибут modelAttribute, который говорит "TransferData", и вы не можете добавить туда еще один.

Если вы хотите передать информацию loggedClient, вы должны изменить подход. Я предлагаю использовать сессию для loggedClients и не передавать ее постранично с формами.

В случае, если сессия не является решением для вас, и вы должны использовать @ModelAttribute, чем вы должны добавить внутри TransferData поля loggedClient и добавить их в форму в качестве входных параметров (довольно плохой дизайн, если честно, поэтому я не предложить это)

0 голосов
/ 02 ноября 2018

Мне кажется, я вижу проблему сейчас. Что происходит, так это то, что loggedClient в вашем JSP находится за пределами формы, поэтому при отправке формы отправляются только данные из TransferData. Если вы хотите отправить фрагменты loggedClient обратно, вам нужно сложить их как скрытые поля ввода в TransferData.

Например, в вашем JSP:

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

Затем в вашем элементе управления удалите параметр loggedClient. Обновите свой класс TransferData, добавив в него свойство loggedClient, и вам следует идти вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...