国と連絡先の 2 つのエンティティがあります。
@Entity
@Table(name="countries")
@NamedQuery(name="Country.findAll", query="SELECT c FROM Country c")
public class Country implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String code;
private String name;
@OneToMany(mappedBy="countryBean")
private List<Contact> contacts;
//...
}
@Entity
@Table(name="contacts")
@NamedQuery(name="Contact.findAll", query="SELECT c FROM Contact c")
public class Contact implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String city;
private String street;
@ManyToOne
@JoinColumn(name="countries_id")
private Country countryBean;
//...
}
新しい連絡先を追加し、データベースから既存の国を選択する必要があります。
私のコントローラーの一部があります:
@RequestMapping(value="/contact/add", method=RequestMethod.GET)
public String contactAddGetPage(Model model) {
Contact contact = new Contact();
model.addAttribute("contact", contact);
List<Country> countries = countryManager.findAll();
model.addAttribute("countries", countries);
return "contactAdd";
}
@RequestMapping(value="/contact/add", method=RequestMethod.POST)
public String contactAddSave(
@Valid @ModelAttribute("contact") Contact contact, BindingResult result,
Model model, final RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
model.addAttribute("error", "error");
return "contactAdd";
}
contactManager.save(contact);
redirectAttributes.addFlashAttribute("message", "ok");
return "redirect:/contact";
}
Spring Form を使用した「contactAdd.jsp」JSP:
<c:url var="sendToUrl" value="/contact/add" />
<form:form method="post" action="${sendToUrl}" commandName="contact">
<table>
<tr>
<td><form:label path="street">Street</form:label></td>
<td><form:input path="street"/></td>
<td><form:errors path="street"></form:errors></td>
</tr>
<tr>
<td><form:label path="city">City</form:label></td>
<td><form:input path="city"/></td>
<td><form:errors path="city"></form:errors></td>
</tr>
<tr>
<td><form:label path="countryBean">Country</form:label></td>
<td>
<form:select path="countryBean">
<form:options items="${countries}" itemValue="id" itemLabel="name" />
</form:select>
</td>
<td><form:errors path="countryBean"></form:errors></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Add" /></td>
</tr>
</table>
</form:form>
www ブラウザーでフォーム ページに移動すると、問題ないように見えます。データベースから国の名前を含むhtml selectがあります。
しかし、「追加」ボタンをクリックすると、「国」フォームが選択されます。
タイプ java.lang.String のプロパティ値をプロパティ countryBean の必要なタイプ com.example.test.entity.Country に変換できませんでした。ネストされた例外は java.lang.IllegalStateException: タイプ [java.lang.String] の値をプロパティ countryBean の必要なタイプ [com.example.test.entity.Country] に変換できません: 一致するエディターまたは変換戦略が見つかりません
エラー了解です。国を「国」クラスに変換する必要があります。しかし、どうすればそれができますか?