gpt4 book ai didi

java - 方法中的@ModelAttribute

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:23 25 4
gpt4 key购买 nike

想象一下这样的代码:

@RequestMapping(value="/users", method=RequestMethod.GET)
public String list(Model model) {
...
}

@InitBinder("user")
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("password"); // Don't allow user to override the value
}

@ModelAttribute("user")
public User prepareUser(@RequestParam("username") String username){
...
}

@RequestMapping(value="/user/save", method=RequestMethod.POST)
public String save(@ModelAttribute("user") User user, Model model) {
...
}

我使用 init binder 来避免绑定(bind)字段,并使用 @ModelAttribute 标记一个方法 (prepareUser()) 以在绑定(bind)之前准备我的 User 对象。因此,当我调用/user/save 时,会执行 initBinder() 和 prepareUser()。

我在@InitBinder 和@ModelAttribute 中都设置了“user”,所以 Spring-MVC 可以理解这个方法应该只在执行带有 @ModelAttribute("user") 的方法之前应用。

问题在于用@ModelAttribute("user") 注释的方法在该 Controller 的每个映射方法之前执行。例如,如果我调用/users prepareUser 在 list() 方法之前执行。我怎样才能让这个准备器只在 save() 方法之前执行,所有方法都在同一个 Controller 中?

谢谢

最佳答案

这并不是 @ModelAttribute 的真正用途。如果您将它用作方法参数,它会将带注释的参数放入模型中(这很好)。如果将它放在方法上,每次都会调用它以提供 Controller 中的每个方法都应该访问的引用数据。

如果您想控制构建您的用户对象,您有多种选择。对我来说最明显的两个是:

  1. 使用您的 InitBinder 方法添加新的自定义编辑器(PropertyEditor 类)以构建用户对象,
  2. 使用conversion service in Spring 3将字符串用户名转换为用户对象。

关于java - 方法中的@ModelAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335432/

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