質問

私はSpring MVCを使用していますが、データベースからAA永続オブジェクトをバインドしてほしいと思っていますが、バインディングする前にDBに電話をかけるためにコードを設定する方法を理解することはできません。たとえば、「benefitype」オブジェクトをデータベースに更新しようとしていますが、データベースからオブジェクトを取得して、すべてのフィールドを更新する必要がないため、データベースからオブジェクトを取得する必要があります。

    @RequestMapping("/save")
public String save(@ModelAttribute("item") BenefitType benefitType, BindingResult result)
{
    ...check for errors
    ...save, etc.
}
役に立ちましたか?

解決 2

そのため、クラス内の同じ名前の@modelattributeでメソッドを注釈することでこれを解決することになりました。スプリングは、リクエストマッピングを実行する前に最初にモデルを構築します。

@ModelAttribute("item")
BenefitType getBenefitType(@RequestParam("id") String id) {
    // return benefit type
}

他のヒント

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

  • オブジェクトに単純なプロパティのみがある場合、最も簡単な場合、すべてのプロパティをフォームフィールドにバインドできます(hidden 必要に応じて)、および送信後に完全にバインドされたオブジェクトを取得します。複雑なプロパティは、フォームフィールドにもバインドできます。 PropertyEditors。

  • また、セッションを使用してオブジェクトを間に保存することもできます GETPOST リクエスト。 Spring 3は、このアプローチを施します @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();
            }
        }
    }
    

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

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

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

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

2つの@RequestMappingsが必要です。1つはGET用、もう1つは投稿してください。

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

その後、投稿で実際にフィールドを更新します。

上記の例では、 @modelattributeには上記の方法のようなメソッドを既に入力する必要があり、プロパティは、フォームバッキングオブジェクトと組み合わせてJSTLやSpring Tabglibsのようなものを使用してバインドする必要があります。

あなたも見たいかもしれません initbinder ユースケースに応じて。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top