Spring-Boot форма пост не обязательная модель - PullRequest
0 голосов
/ 31 октября 2019

Я немного застрял, потому что согласно документации это должно работать, но после публикации моей формы все мои поля модели будут нулевыми. Если бы кто-то мог указать, что мне не хватает, было бы здорово.

Вот моя модель:

package hello.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
public class Post {
    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotNull
    private String email;

    @NotNull
    private String content;

    public Post() { }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "Post{" +
                "email='" + email + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}

мой фрагмент тимелист с формой:

<div xmlns:th="http://www.thymeleaf.org" th:fragment="wysiwyg" class="panel-body">
    <form class="form-horizontal" role="form" method="post" action="#" th:action="@{/post}" th:object="post">
        <div class="form-group">
            <label for="email">Email</label>
            <input id="email" type="email" class="form-control" placeholder="Enter email..." th:field="*{email}"
                   required/>
            <small id="emailHelp" class="form-text text-muted">Enter your email address just in case.</small>
        </div>
        <div class="form-group">
            <label for="content">Post</label>
            <textarea id="content" class="form-control" th:field="*{content}"></textarea>
            <small id="bodyHelp" class="form-text text-muted">Type your post in here.</small>
        </div>
        <button id="btnPost" class="btn btn-primary" type="submit">Submit</button>
    </form>

    <script>
        $(document).ready(function() {
            $('#teszt2').summernote({
                "height": 200
            });
        });
    </script>
</div>

исоответствующий метод контроллера:

@PostMapping("/post")
public String testPost(Post post, Model model) {
    System.out.println(post);
    return "index";
}

Ожидаемое поведение будет иметь Post {email = $ email, content = $ content}, но я получаю только следующее: Post {email = null, content =null} и я не понимаю почему. Что я делаю неправильно? Что мне не хватает? Все онлайн-учебники утверждают, что это просто работает, но у меня явно не работает.

@ Обновление:

Небольшое обновление. Так что я могу заставить его работать, но только так:

@GetMapping("/post")
public String openEditor(Model model) {
    model.addAttribute("post", new Post());
    model.addAttribute("content", "wysiwyg");

    return "index";
}

Итак, я создаю новый Пустой пост. В моем фрагменте я меняю форму с th: object = "post" на th: object = "$ {post}". Тогда в моем PostMapping:

@PostMapping("/post")
public String testPost(@ModelAttribute("post") Post post, Model model) {
    System.out.println(post); // Works well
    return "index";
}

Почему это не работает, если я не использую ModelAttribute и не создаю пустое сообщение в первую очередь. Я ожидал, что это сработает ... очевидно, я был не прав

1 Ответ

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

По моему мнению, вы не должны связывать свой объект Entity напрямую с формой отправки.

Я предлагаю следовать стандартной практике, чтобы создать класс PostRequest и использовать поля, которые вы хотите получить из своей формы. Объявите это в подписи @PostMapping метода как @RequestBody PostRequest postRequest. Когда у вас есть объект в вашем методе контроллера, вы можете проверить входные данные и создать объект из объекта, а затем использовать его для дальнейшего хранения в вашей базе данных.

Практика проста, не смешивайте ваш запрос / ответобъекты с объектами вашей базы данных объектов. Это также рискованно, когда вы храните любую конфиденциальную информацию в своей базе данных.

Не уверен, как это работает с шаблонами Thymeleaf, но должен быть способ следовать этой практике. Надеюсь, это поможет.

...