9

spring MVC で UI にバインドしようとしているユーザー オブジェクトがあります。ユーザー オブジェクトには別のオブジェクト アドレスがあります。

public class User {
    String firstName;
    String lastName;
    String userName;
    Address address;
}

アドレス オブジェクト。

public class Address {
    String street;
    String House;
    String country;
}

ユーザー オブジェクトを UI にバインドする場合、たとえばユーザー編集機能のために、firstName と lastName のみを保持したいと考えています。

User の残りのプロパティを非表示フィールドとして保持しない場合の最初の質問は、これらの値が null になることです。これは、UI のバインド オブジェクトがユーザー オブジェクトの新しいインスタンスであることを意味します。同じユーザー オブジェクトを操作して UI にバインドし、古い値で更新された値のみを取得することはできませんか?

第二に、隠しフィールドメソッドによって、私は Address オブジェクトを取得していません。そのために null を取得しています

<form:hidden path="user.address" />

user は私のモーダル属性です。

Spring MVC についての私の理解にギャップがあるかもしれません。UI でオブジェクトをバインドするには、常に新しいインスタンスを作成する必要がありますか? ネストされている場合、ネストされたオブジェクト (アドレス) をバインドされたモーダル属性に戻すにはどうすればよいですか?

オプションの1つは、バインダーを使用していると思います。しかし、私が理解している限り、バインダーはidを使用してオブジェクトも取得しますか?? クエリを保存してそのオブジェクトを取得できる回避策を教えてください

4

1 に答える 1

14

オブジェクトをAddress元に戻すには、個々のプロパティをそれぞれリストする必要があります。例:

<form:hidden path="user.address.street" />
<form:hidden path="user.address.country" />

等々。

ここで、UI にバインドするオブジェクトは、コントローラーから渡したオブジェクトです。Userフォームが送信されたときに、オブジェクトを として戻したいと想定しています@ModelAttribute。その場合、2 つのオプションがあります。1 つ目はUser、クライアント側でオブジェクトのすべてのプロパティを一覧表示する必要があることです (非表示のオブジェクトまたは表示されているフォーム要素として)。

2 番目のオプションは、クライアント側で必要なプロパティのみを表示し、他のすべてのプロパティを非表示フィールドとしてリストするのではなく、idインスタンスのUserのみを非表示フィールドとして保持することです。@ModelAttributeフォーム送信時にこれを受け取ると、 を使用してデータベースからオブジェクト全体をロードし、idを呼び出す前に更新されたプロパティを設定できますupdate

例:

@RequestMapping("updateUser.do")
public String updateUser(@ModelAttribute User user, ... /* rest of the args */) {
    // ... some other code
    User existingUser = userService.findById(user.getId());
    existingUser.setFirstName(user.getFirstName());
    existingUser.setLasstName(user.getLastName());

    userService.update(existingUser);
    // ... rest of the code
}

クライアント側で必要なプロパティのみを操作して、それを同じ既存のオブジェクトとマージする方法はありません。

于 2013-06-03T12:18:58.583 に答える