Как заполнить модель первичным ключом при сохранении через контроллер - PullRequest
0 голосов
/ 23 октября 2019

Я совсем новичок в интеграции Spring и Thymeleaf, так что терпите меня:

У меня проблемы с получением данных из моего шаблона Thymeleaf с использованием модели JPA. Я пытался использовать стратегии последовательной генерации и генерации идентичности, но он даже не позволяет мне загрузить страницу

Я пытался создать совершенно новую переменную, как было показано ранее, но это явно не проблема. Я знаю, что проблема может исходить из ссылок Thymeleaf из HTML, но я совершенно запутался;Есть ли способ автоматического создания идентификатора? Он даже не позволяет мне добавить значение в форму в виде идентификатора

class Admin(@Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long, var firstName: String, var lastName: String, var login: String, var password: String) {
    @PostMapping("/addstuff")
    fun addAdmin(@ModelAttribute(name = "admin") admin: Admin, result: BindingResult, model: Model): String {
        val newAdmin: Admin = Admin(admin.id, admin.firstName, admin.lastName, admin.firstName[0].plus(admin.lastName), encoder.encode("password"))
        adminRepository.save(newAdmin)
        return "adminadd"
    }

form action="#" data-th-action="@{/addstuff}" th:object="${admin}" method="post">
    <div class="row justify-content-center" id="mainBody">
        <div class="col-8">
            <div id="student0">
                <div class="row">
                    <div class="col">
                        Administrator Information
                    </div>
                </div>
                <div class="row">
                    <div class="col">
                        <input th:field="*{firstName}" type="text" class="form-control" placeholder="First name">
                    </div>
                    <div class="col">
                        <input th:field="*{lastName}" type="text" class="form-control" placeholder="Last name">
                    </div>
                    <div class="col">
                        <input type="number" class="form-control" placeholder="Administrator ID number">
                    </div>
                </div>
                <div class="row">
                    <div class="col">
                        <label>Role
                            <div class="form-check">
                                <input class="form-check-input" type="radio" name="exampleRadios" id="adminRadio"
                                       value="option1" checked>
                                <label class="form-check-label" for="adminRadio">
                                    Administrator
                                </label>
                            </div>
                            <div class="form-check">
                                <input class="form-check-input" type="radio" name="exampleRadios" id="profRadio"
                                       value="option2">
                                <label class="form-check-label" for="profRadio">
                                    Professor
                                </label>
                            </div>
                        </label>
                    </div>
                </div>
                <hr>
            </div>
            <input id="submitAdmin" type="submit" value="Add Administrator">
            <!--            <button id="submitAdmin">Add Administrator</button>-->

        </div>
    </div>
</form>

Ожидаемый результат должен состоять в сохранении данных в моем локальном БД, но в результате ошибки яget это:

'admin' on field 'id': rejected value [null]; codes [typeMismatch.admin.id,typeMismatch.id,typeMismatch.long,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [admin.id,id]; arguments []; default message [id]]; default message [Failed to convert value of type 'null' to required type 'long'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [null] to type [@javax.persistence.Id @javax.persistence.GeneratedValue long] for value 'null'; nested exception is java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type]]

Я знаю, что это связано со значением id, но я застрял в том, как я генерирую значение для него. Я использую встроенную базу данных h2, если кому-то интересно. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Я понял это! Я использовал обычный старый тэг html name и тимилеф проанализировал и прочитал его.

<div class="col">
    <input type="text" name="lastName" class="form-control" placeholder="Last name">
</div>
0 голосов
/ 23 октября 2019

Хотя ваш вопрос касается данных, которые не передаются между шаблоном и JPA, но исключение ясно говорит о проблеме только с JPA. Вам никогда не требуется передавать ID при сохранении нового объекта в базе данных. Я подозреваю, что ваш столбец идентификатора в таблице базы данных не определен с помощью стратегии автоматической генерации. Можете ли вы попробовать изменить его и перезапустить код.

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