0

国と連絡先の 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] に変換できません: 一致するエディターまたは変換戦略が見つかりません

エラー了解です。国を「国」クラスに変換する必要があります。しかし、どうすればそれができますか?

4

1 に答える 1

0

PropertyEditorSupport はうまく機能します: http://empire5.com/development/binding-a-custom-object-in-spring-3/

MySQL でエラーが発生しました (データベースの不正な列)。

于 2014-05-20T23:37:50.927 に答える