Thymeleafによって処理されるHTMLフォームを使用して、Spring内のProject
オブジェクトを生成またはバインドしたいとします。すべてがこれまでのところ働いていますが、チェックボックスをチェックすることでロールで埋められるリストフィールドはまだ機能していません。Spring Thymeleafチェックボックスの値をコレクションフィールドにバインドする方法
Projectクラス
package com.floriantoenjes.instateam.model;
import javax.persistence.*;
import java.util.List;
@Entity
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String description;
private String status;
@ManyToMany
private List<Role> rolesNeeded;
@ManyToMany
private List<Collaborator> collaborators;
public Project() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<Role> getRolesNeeded() {
return rolesNeeded;
}
public void setRolesNeeded(List<Role> rolesNeeded) {
this.rolesNeeded = rolesNeeded;
}
public List<Collaborator> getCollaborators() {
return collaborators;
}
public void setCollaborators(List<Collaborator> collaborators) {
this.collaborators = collaborators;
}
}
役割クラス
package com.floriantoenjes.instateam.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
public Role() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
コントローラ
package com.floriantoenjes.instateam.web.controller;
import com.floriantoenjes.instateam.model.Project;
import com.floriantoenjes.instateam.model.Role;
import com.floriantoenjes.instateam.service.ProjectService;
import com.floriantoenjes.instateam.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
@Controller
public class ProjectController {
@Autowired
ProjectService projectService;
@Autowired
RoleService roleService;
@RequestMapping("/add")
public String newProjectForm(Model model) {
List<Role> roles = roleService.findAll();
model.addAttribute("project", new Project());
model.addAttribute("roles", roles);
return "edit_project";
}
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addProject(Project project) {
projectService.save(project);
return "redirect:/index";
}
}
テンプレート
<!DOCTYPE html>
<html>
<head th:replace="layout :: head('Edit Project')"></head>
<body>
<header>
<div class="container">
<div class="site-header">
<a class="logo" href="index.html">InstaTeam</a>
<a class="new-project button icon-left" href="#"><i class="material-icons">add</i> New Project</a>
</div>
</div>
</header>
<nav>
<ul>
<li class="selected"><a href="index.html">Projects</a></li>
<li><a href="collaborators.html">Collaborators</a></li>
<li><a href="roles.html">Roles</a></li>
</ul>
</nav>
<section>
<div class="container wrapper">
<form th:object="${project}" action="" method="post">
<div>
<label for="project_name"> Project Name:</label>
<input type="text" th:field="*{name}" name="project_name"/>
</div>
<div>
<label for="project_description">Project Description:</label>
<textarea rows="4" th:field="*{description}" name="project_description"></textarea>
</div>
<div>
<label for="project_status">Project Status:</label>
<div class="custom-select">
<span class="dropdown-arrow"></span>
<select th:field="*{status}" name="project_status">
<option value="active">Active</option>
<option value="archived">Archived</option>
<option value="not_started">Not Started</option>
</select>
</div>
</div>
<div>
<label for="project_roles">Project Roles:</label>
<ul class="checkbox-list">
<li th:each="role : ${roles}">
<input type="checkbox" th:field="*{rolesNeeded}" name="project_roles" th:value="${role.id}"/>
<span class="primary" th:text="${role.name}"></span>
</li>
</ul>
</div>
<div class="actions">
<input type="submit" value="Save" class="button"/>
<a href="#" class="button button-secondary">Cancel</a>
</div>
</form>
</div>
</section>
</body>
</html>
ご覧のとおり、rolesNeeded
はコレクションで、ロールのチェックボックスにチェックを入れ、フォームを送信すると、 "rolesNeeded"コレクションに割り当てられたロールを持つProjectオブジェクトを生成できます。私は今すぐ*{rolesNeeded}
と{role.id}
と入力しているので動作しません。
今私は、次のエラーを取得しています:
There was an unexpected error (type=Bad Request, status=400). Validation failed for object='project'. Error count: 1
うまくいけば、誰かがこれを解決する方法や、おそらく私は、より詳細なエラーメッセージを取得することができていますか提案を持っています。
種類よろしく、 フロリアン
エラーについて:最も有用な方法は、おそらくブラウザのデバッガで[ネットワーク]タブを開いて、送信されているリクエストデータを調べることです。 – chrylis
"$ {role.id}" />と$ {role.name} ">に関する質問。ロールBean(pojo)クラスを表示できますか? –
chrylisはすばらしいコメントをいただき、ありがとうございました。投稿のリクエストに選択したロールのロールIDが含まれていることを確認してください。 Hey Georges私の質問にロールクラスを追加しました。 – Florian