我喜欢在其编辑表单中显示一个已从其他页面选择的对象。选择页面通过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
}
答案 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)