"プロジェクト"Springの "<フォーム:選択.." は動作しません、HTTPステータス400
@Entity
@Table(name = "projects")
public class Project extends NamedEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name")
private String name;
@Column(name = "start_date")
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date startDate;
@Column(name = "end_date")
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date endDate;
@Column(name = "description")
private String description;
@Column(name = "notes")
private String notes;
@ManyToOne
@JoinColumn(name = "project_status_id")
private ProjectStatus projectStatus;
@ManyToOne
@JoinColumn(name = "project_objective_id")
private ProjectObjective projectObjective;
// Getters & Setters...
}
"ProjectStatus"
@Entity
@Table(name = "project_statuses")
public class ProjectStatus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name")
private String name;
// Getters & Setters...
}
"ProjectObjective"
@Entity
@Table(name = "project_objectives")
public class ProjectObjective {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name")
private String name;
// Getters & Setters...
}
"コントローラ"
@Controller
public class ProjectController {
@Autowired
private FirmManagerService firmManagerService;
@ModelAttribute("statuses")
public Collection<ProjectStatus> populateProjectStatuses() {
return this.firmManagerService.findProjectStatuses();
}
@ModelAttribute("objectives")
public Collection<ProjectObjective> populateProjectObjectives() {
return this.firmManagerService.findProjectObjectives();
}
@RequestMapping(value = "/projects/{projectId}/edit", method = RequestMethod.GET)
public String initUpdateProjectForm(@PathVariable("projectId") long projectId, Model model) {
Project project = this.firmManagerService.findProjectById(projectId);
model.addAttribute("project", project);
return "projects/createOrUpdateProject";
}
@RequestMapping(value = "/projects/{projectId}/edit", method = RequestMethod.POST)
public String processUpdateProjectForm(@ModelAttribute("project") Project project, ModelMap model) {
model.put("project", project);
return "projects/testEditProjectPage";
}
//...
}
JSP "createOrUpdateProject"
<form:form modelAttribute="project" method="post" action="/projects/${project.id}/edit"
class="form-horizontal">
<input type="hidden" name="id" value="${project.id}"/>
<label>Name</label>
<form:input class="form-control" path="name"/>
<label>Start Date</label>
<form:input class="form-control" path="startDate"/>
<label>End Date</label>
<form:input class="form-control" path="endDate"/>
<label>Description</label>
<form:input class="form-control" path="description"/>
<label>Notes</label>
<form:input class="form-control" path="notes"/>
<label>Project's Status</label>
<form:select class="form-control" path="projectStatus" items="${statuses}" size="4"/>
<label>Project's Objective</label>
<form:select class="form-control" path="projectObjective" items="${objectives}" size="7"/>
<div class="form-group">
<button class="btn btn-default" type="submit">Update Project</button>
</div>
</form:form>
JSP "testEditProjectPage"
<table class="table table-striped">
<tr>
<th>ID</th>
<td><b><c:out value="${project.id}"/></b></td>
</tr>
<tr>
<th>Name</th>
<td><b><c:out value="${project.name}"/></b></td>
</tr>
<tr>
<th>Status ID</th>
<td><c:out value="${project.projectStatus.id}"/></td>
</tr>
<tr>
<th>Status</th>
<td><c:out value="${project.projectStatus.name}"/></td>
</tr>
<tr>
<th>Objective ID</th>
<td><c:out value="${project.projectObjective.id}"/></td>
</tr>
<tr>
<th>Objective</th>
<td><c:out value="${project.projectObjective.name}"/></td>
</tr>
<tr>
<th>Description</th>
<td><c:out value="${project.description}"/></td>
</tr>
<tr>
<th>Notes</th>
<td><c:out value="${project.notes}"/></td>
</tr>
<tr>
<th>Start date</th>
<td><fmt:formatDate value="${project.startDate}" pattern="yyyy-MM-dd"/></td>
</tr>
<tr>
<th>End date</th>
<td><fmt:formatDate value="${project.endDate}" pattern="yyyy-MM-dd"/></td>
</tr>
プロジェクトはprojectStatusとprojectObjectiveを持っています。問題は、私が "project"フィールドに "projectStatus"と "projectObjective"をspringの "form:select"を使ってポストしていると、HTTP 400エラー(クライアントから送信されたリクエストは構文的に間違っています)です。
私はJSPフォームからこれらの二つの選択を除いていた場合、それが適切に最近投稿プロジェクトを示しているが、当然のNULL状況や目的のフィールドを持ちます。
Please Please !! POSTデータのためにこの "form:select"を正しく使用する方法を明確にしてください。この問題のため、私はprojectStatusとprojectObjectiveの "id"と "name"フィールドがNULLなので、entityManager.merge(プロジェクト)を使って "EDIT"プロジェクトを作成できません:(
私はこのプロジェクトをSpring's 。PetClinicコードPetClinicではそれだけで正常に動作します私は同じフィールド「projectStatus」とちょうどそのようPetClinicの「ペット」の実体 の「タイプ」のような「projectObjective」があります。フォームの
<form:form modelAttribute="pet"
<input type="hidden" name="id" value="${pet.id}"/>
<form:input class="form-control" path="name"/>
<form:input class="form-control" path="birthDate"/>
<form:select class="form-control" path="type" items="${types}" size="5"/>
<button class="btn btn-default" type="submit">Update Pet</button>
</form:form>
JSTLの代わりにselect通常のHTMLセレクト –