gpt4 book ai didi

java - Spring MVC 使用 GET 请求提交并绑定(bind)对象

转载 作者:行者123 更新时间:2023-11-30 06:45:48 25 4
gpt4 key购买 nike

我喜欢以编辑形式显示之前从另一个页面选择的对象。选择页面通过 GET 将所选对象的 id 传输到我的 Controller 。

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

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

示例选择 JSP 页面,它将通过 GET 请求将 id 传输到我的 Controller :

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

带有 PropertyEditor 类和 InitBind 方法的我的 Controller

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

最佳答案

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

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

关于java - Spring MVC 使用 GET 请求提交并绑定(bind)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43708001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com