【问题标题】:Spring boot 2 Post required type exceptionSpring boot 2 Post required 类型异常
【发布时间】:2019-02-25 06:44:54
【问题描述】:

我正在尝试学习 spring-boot,但我有一个问题我不明白如何解决以及具体失败的原因。我有一个博客,当我以博客文章形式尝试创建新文章(文章)时,它失败了。如果可能,请帮助我上路并了解问题所在,因为我看不到转换错误的地方。

预期行为:新帖子行已添加到数据库中

当前行为:错误类型不匹配。

错误信息: enter image description here

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;

用户类

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;

}

后控制器

    @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

【问题讨论】:

  • 请分享 post json 和 postService.save(post) 代码。
  • 还共享用户实体类和服务类以保存,因为您为 USer 对象传递的 id 可能是您的实体和多对多表实体之间的数据类型问题

标签: java spring-boot post controller thymeleaf


【解决方案1】:

您的问题基本上与 Post 对象内的用户参数有关。您正在将用户信息发送到视图并将其隐藏,但您不能为此使用输入字段。

这是错的那一行

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

您应该使用原始值,在本例中为用户 ID。

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

然后,当您再次收到帖子时,您将可以访问用户 ID 和所有用户信息。如果您需要修改某些用户特定信息,请通过 user.XX 访问它们并在 post 方法中读取它

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 2015-12-28
    • 2022-06-19
    • 2019-01-06
    • 2019-12-26
    • 2019-09-05
    • 2018-11-11
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多