2017-04-30 12 views
1

私は以前に別のページから選択したオブジェクトをその編集フォームに表示します。選択ページは、選択したオブジェクトのIDをGET経由でコントローラに送信します。Spring MVCはGETリクエストでオブジェクトをサブミットしてバインドします

パラメータはメッセージオブジェクトにバインドされ、プロパティエディタを使用して自動的に初期化されるように強制することはできますか?

現時点では、常にidプロパティが設定された新しいオブジェクトを取得しますが、プロパティエディタでは初期化されません。私のGETリクエストには何が欠けていますか?

<a href="message?id=${message.id}">${message.title}</a> 

なPropertyEditorクラスとInitBind方法で私のコントローラ

@Controller 
public class MessageController { 

    @Autowired 
    private MessageRepository messageRepository; 

    @RequestMapping(value="/message", method = RequestMethod.GET) 
    public String handleMessage(Model model,@ModelAttribute("message") Message message) { 

    // ISSUE Here the message object has only the "id" property set but get not initialized through the binder 
    System.out.println(message); 

    return "message"; 
    } 

    // inline property editor for message class 
    public class MessagePropertyEditor extends PropertyEditorSupport { 
     @Override 
     public String getAsText() { 
      return String.valueOf(((Message) getValue()).getId()); 
     } 

     @Override 
     public void setAsText(String id) throws IllegalArgumentException { 
      Message message = messageRepository.getMessageById(Integer.valueOf(id)); 
     setValue(message); 
     } 
    } 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Message.class, new MessagePropertyEditor()); 
    } 
} 

例メッセージBeanクラス

:私のコントローラにGETリクエストを経由してIDを送信します

例の選択JSPページ、

public class Message { 
    private int id; 

    private String title; 

    private String text; 

    // getter & setter methods 
} 
+0

'=' RequestParam' @。 –

答えて

1

PropertyEditorの代わりに@RequestMappingメソッドの隣に@ModelAttribute注釈付きメソッドを使用することをおすすめします。

@ModelAttribute 
public Message modelAttribute(@RequestParam("id") int id) { 
    return messageRepository.getMessageById(id); 
} 

であり、あなたがあなたのMessagePropertyEditor@InitBinderアノテーション付きメソッドを削除することができますようご@RequestMappingを残します。これは、このようなものになるでしょう。

@Controller 
@RequestMapping("/message") 
public class MessageController { 

    @Autowired 
    private MessageRepository messageRepository; 

    @ModelAttribute 
    public Message modelAttribute(@RequestParam("id") int id) { 
     return messageRepository.getMessageById(id); 
    } 

    @GetMapping 
    public String handleMessage(Model model,@ModelAttribute("message") Message message) { 
    System.out.println(message); 

    return "message"; 
    } 
} 
+0

ありがとう、これは私のために働く – megloff

0

このようなPARAMTERメッセージに@RequestParam( "ID")を追加します!ModelAttribute` @

public String handleMessage(Model model,@RequestParam("id") @ModelAttribute("message") Message message) 
関連する問題