Spring-启动形式post不绑定模型
Spring-Boot form post not binding model
我有点卡住了,因为根据文档,这应该可行,但是在 posting 我的表单后,我的所有模型字段都是空的。如果有人能指出我遗漏的内容,那就太好了。
这是我的模型:
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";
}
所以我创建了一个新的 Empty post。在我的片段中,我将形式从 th:object="post" 更改为 th:object="${post}"。然后在我的Post映射中:
@PostMapping("/post")
public String testPost(@ModelAttribute("post") Post post, Model model) {
System.out.println(post); // Works well
return "index";
}
如果我不使用 ModelAttribute 并且不首先创建一个空的 Post,为什么它不起作用。我希望它能工作...显然我错了
在我看来,您不应该将实体对象直接与提交表单联系起来。
我建议按照标准做法创建 PostRequest
class 并使用您希望从表单中获取的字段。在您的 @PostMapping
方法签名中将其声明为 @RequestBody PostRequest postRequest
。一旦你在你的控制器方法中有了这个对象,你就可以验证输入并从对象中创建实体,然后进一步使用它来存储在你的数据库中。
做法很简单,不要将您的 request/response 对象与您的数据库实体对象混在一起。当您在数据库中存储任何敏感信息时,这也是有风险的。
不确定这如何与 Thymeleaf 模板一起使用,但应该有一种方法可以遵循这种做法。希望这有帮助。
我有点卡住了,因为根据文档,这应该可行,但是在 posting 我的表单后,我的所有模型字段都是空的。如果有人能指出我遗漏的内容,那就太好了。
这是我的模型:
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";
}
所以我创建了一个新的 Empty post。在我的片段中,我将形式从 th:object="post" 更改为 th:object="${post}"。然后在我的Post映射中:
@PostMapping("/post")
public String testPost(@ModelAttribute("post") Post post, Model model) {
System.out.println(post); // Works well
return "index";
}
如果我不使用 ModelAttribute 并且不首先创建一个空的 Post,为什么它不起作用。我希望它能工作...显然我错了
在我看来,您不应该将实体对象直接与提交表单联系起来。
我建议按照标准做法创建 PostRequest
class 并使用您希望从表单中获取的字段。在您的 @PostMapping
方法签名中将其声明为 @RequestBody PostRequest postRequest
。一旦你在你的控制器方法中有了这个对象,你就可以验证输入并从对象中创建实体,然后进一步使用它来存储在你的数据库中。
做法很简单,不要将您的 request/response 对象与您的数据库实体对象混在一起。当您在数据库中存储任何敏感信息时,这也是有风险的。
不确定这如何与 Thymeleaf 模板一起使用,但应该有一种方法可以遵循这种做法。希望这有帮助。