5

Spring MVCを使用していて、データベースから永続オブジェクトをバインドしたいのですが、バインドする前にDBを呼び出すようにコードを設定する方法がわかりません。たとえば、「BenefitType」オブジェクトをデータベースに更新しようとしていますが、新しいオブジェクトを作成するのではなく、データベースからオブジェクトを取得したいので、すべてのフィールドを更新する必要はありません。

    @RequestMapping("/save")
public String save(@ModelAttribute("item") BenefitType benefitType, BindingResult result)
{
    ...check for errors
    ...save, etc.
}
4

4 に答える 4

4

いくつかのオプションがあります:

  • オブジェクトに単純なプロパティしかない最も単純なケースでは、すべてのプロパティをフォームフィールドにバインドし(hidden必要な場合)、送信後に完全にバインドされたオブジェクトを取得できます。複雑なプロパティは、sを使用してフォームフィールドにバインドすることもできますPropertyEditor

  • GETセッションを使用して、とPOSTリクエストの間にオブジェクトを保存することもできます。Spring 3は、( Petclinicサンプルからの)@SessionAttributes注釈を使用してこのアプローチを容易にします。

    @Controller
    @RequestMapping("/owners/*/pets/{petId}/edit")
    @SessionAttributes("pet") // Specify attributes to be stored in the session       
    public class EditPetForm {    
        ...
        @InitBinder
        public void setAllowedFields(WebDataBinder dataBinder) {
            // Disallow binding of sensitive fields - user can't override 
            // values from the session
            dataBinder.setDisallowedFields("id");
        }
        @RequestMapping(method = RequestMethod.GET)
        public String setupForm(@PathVariable("petId") int petId, Model model) {
            Pet pet = this.clinic.loadPet(petId);
            model.addAttribute("pet", pet); // Put attribute into session
            return "pets/form";
        }
        @RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST })
        public String processSubmit(@ModelAttribute("pet") Pet pet, 
            BindingResult result, SessionStatus status) {
            new PetValidator().validate(pet, result);
            if (result.hasErrors()) {
                return "pets/form";
            } else {
                this.clinic.storePet(pet);
                // Clean the session attribute after successful submit
                status.setComplete();
                return "redirect:/owners/" + pet.getOwner().getId();
            }
        }
    }
    

    ただし、このアプローチでは、フォームの複数のインスタンスが同じセッションで同時に開いている場合に問題が発生する可能性があります。

  • したがって、複雑なケースで最も信頼できるアプローチは、フォームフィールドを格納するための個別のオブジェクトを作成し、そのオブジェクトからの変更を手動で永続オブジェクトにマージすることです。

于 2010-09-09T11:04:51.953 に答える
4

そのため、クラス内の同じ名前の@ModelAttributeでメソッドにアノテーションを付けることで、これを解決することになりました。Springは、リクエストマッピングを実行する前に、最初にモデルをビルドします。

@ModelAttribute("item")
BenefitType getBenefitType(@RequestParam("id") String id) {
    // return benefit type
}
于 2011-09-09T15:57:30.627 に答える
0

ドメインモデルが非常に単純であるため、UIオブジェクトをデータモデルオブジェクトに直接バインドできる可能性がありますが、そうではない可能性が高くなります。その場合は、フォームバインド専用のクラスを設計することを強くお勧めします。それとコントローラのドメインオブジェクトの間で変換します。

于 2010-09-08T22:47:29.793 に答える
0

私は少し混乱しています。あなたは実際に更新ワークフローについて話していると思いますか?

2つの@RequestMappingが必要です。1つはGET用、もう1つはPOST用です。

@RequestMapping(value="/update/{id}", method=RequestMethod.GET)
public String getSave(ModelMap model, @PathVariable Long id)
{
    model.putAttribute("item", benefitDao.findById(id));
    return "view";
}

次に、POSTで実際にフィールドを更新します。

上記の例では、@ ModelAttributeに上記のメソッドのようなメソッドが既に設定されている必要があり、プロパティは、フォームバッキングオブジェクトと組み合わせてJSTLやSpringタブグリブなどを使用してバインドされます。

ユースケースによっては、 InitBinderを確認することもできます。

于 2010-09-09T04:00:17.300 に答える