Spring MVC使用GET请求提交和绑定对象

时间:2017-04-30 15:22:51

标签: java spring spring-mvc bind

我喜欢在其编辑表单中显示一个已从其他页面选择的对象。选择页面通过GET将所选对象的ID传送给我的控制器。

如何强制参数绑定到消息对象,然后使用我的属性编辑器自动初始化?

目前我总是得到一个新的对象,其id属性设置但未通过我的属性编辑器初始化。我的GET请求中缺少什么?

示例选择JSP页面,它将通过GET请求将id发送到我的控制器:

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

我的Controller with 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类

public class Message {
  private int id;

  private String title;

  private String text;

  // getter & setter methods
}

2 个答案:

答案 0 :(得分:1)

我建议您使用PropertyEditor方法旁边的@ModelAttribute带注释的方法,而不是使用@RequestMapping

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

保持@RequestMapping不变,您可以删除MessagePropertyEditor@InitBinder带注释的方法。这会产生类似的结果。

@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";
  }
}

答案 1 :(得分:0)

将@RequestParam(&#34; id&#34;)添加到参数消息中,如下所示:

public String handleMessage(Model model,@RequestParam("id") @ModelAttribute("message") Message message)