Spring boot 2 Post обязательный тип исключения - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь научиться весенней загрузке, но у меня есть одна проблема, которую я не понимаю, как решить и что конкретно не работает.У меня есть блог, и когда я пытаюсь создать новый пост (статью) в блоговом бланке, он терпит неудачу.Пожалуйста, если возможно, помогите мне встать на дорогу и понять, в чем проблема, потому что я не вижу, где происходит неправильное преобразование.

Ожидаемое поведение: Новая строка записи добавлена ​​в базу данных

ТекущийПоведение: Я получил несовпадение типов ошибок.

Сообщение об ошибке: введите описание изображения здесь

Post.class

    @Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "post_id")
private Long id;

@Column(name = "title", nullable = false)
@Length(min = 5, message = "*Pavadinimas turi turėti bent 5 simbolius")
@NotEmpty(message = "*Įrašykite pavadinimą")
private String title;

@Column(name = "body", columnDefinition = "TEXT")
private String body;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date", nullable = false, updatable = false)
@CreationTimestamp
private Date createDate;

@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
@NotNull
private User user;

@OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE)
private Collection<Comment> comments;

User.class

public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private int id;

@Column(name = "email", unique = true, nullable = false)
@Email(message = "*Netinkamas El. Pašto formatas")
@NotEmpty(message = "*Įrašykite El. Paštą")
private String email;

@Column(name = "username", nullable = false, unique = true)
@Length(min = 5, message = "*Slapyvardis turi turėti bent 5 simbolius")
@NotEmpty(message = "*Įrašykite slapyvardį")
private String username;

@Column(name = "password", nullable = false)
@Length(min = 5, message = "*Slaptažodis turi turėti bent 5 simbolius")
@NotEmpty(message = "*Įrašykite slaptažodį")
@JsonIgnore
private String password;

@Column(name = "name")
@NotEmpty(message = "*Įrašykite savo vardą")
private String name;

@Column(name = "last_name")
@NotEmpty(message = "*Įrašykite savo pavardę")
private String lastName;

@Column(name = "profession")
@NotEmpty(message = "*Pasirinkite savo profesija")
private String profession;

@Column(name = "active", nullable = false)
private boolean active;

@Column(name = "tenant", nullable = false)
private String tenant;

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Collection<Role> roles;

@OneToMany(mappedBy = "user")
private Collection<Post> posts;

}

PostController

    @RequestMapping(value = "/newPost", method = RequestMethod.POST)
public String createNewPost(@Valid Post post,
                            BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
        for (Object object : bindingResult.getAllErrors()) {
            if (object instanceof FieldError) {
                FieldError fieldError = (FieldError) object;

                System.out.println("Field Error "+fieldError.getCode()+"\n");
                System.out.println(fieldError.getObjectName()+"\n");
                System.out.println(fieldError.getDefaultMessage()+"\n");
            }

            if (object instanceof ObjectError) {
                ObjectError objectError = (ObjectError) object;

                System.out.println("Object Error"+objectError.getCode());
                System.out.println(objectError.getObjectName()+"\n");
                System.out.println(objectError.getDefaultMessage()+"\n");
            }
        }
        return "/postForm";
    } else {
        postService.save(post);
        return "redirect:/blog/" + post.getUser().getUsername();
    }
}

Просмотр сообщений

        <div class="row align-items-center justify-content-center" style="margin-top:20px">
        <div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3">
            <form autocomplete="off" action="#" th:action="@{/newPost}"
                  th:object="${post}" method="post" class="form-horizontal"
                  role="form">

                <h2 class="text-center">Jūsų naujas straipsnis</h2>

                <div class="form-group">
                    <label th:if="${#fields.hasErrors('title')}" th:errors="*{title}"
                           class="alert alert-danger"></label>
                    <input type="text" th:field="*{title}" placeholder="Pavadinimas"
                           class="form-control input-lg"/>
                </div>

                <div class="form-group">
                    <label th:if="${#fields.hasErrors('body')}" th:errors="*{body}"
                           class="alert alert-danger"></label>
                    <textarea th:field="*{body}" placeholder="Tekstas"
                              class="form-control input-lg"/>
                </div>

                <input type="hidden" th:field="*{user}"/>
                <input type="hidden" th:field="*{id}"/>

                <div class="form-group">
                    <input type="submit" class="btn btn-primary btn-block" value="Saugoti"/>
                </div>

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

    <div class="row" th:if="${post.id}">
        <div class="col-md-6 col-md-offset-3">
            <form action="#" th:action="@{'/post/{id}'(id=${post.id})}" th:method="delete"
                  class="form-horizontal">
                <div class="form-group">
                    <input type="hidden" name="_method" value="delete"/>
                    <button type="submit" class="btn btn-danger btn-block" th:text="Ištrinti">Ištrinti</button>
                </div>
            </form>

GitHub репозиторий: https://github.com/Manvas/mentor/tree/develop

1 Ответ

0 голосов
/ 21 сентября 2018

Ваша проблема в основном с пользовательским параметром внутри объекта Post.Вы отправляете информацию о пользователе в представление и скрываете ее, но не можете использовать поле ввода для этого.

Это неверная строка

<input type="hidden" th:field="*{user}"/>

И вам следует использоватьпримитивное значение, в данном случае идентификатор пользователя.

<input type="hidden" th:field="*{user.id}"/>

Затем, когда вы снова получите сообщение, у вас будет доступ к идентификатору пользователя и всей информации пользователя.Если вам нужно изменить какую-то специфическую для пользователя информацию, то получите к ней доступ через user.XX и прочитайте ее методом post

...