想象一下这样的代码:
@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 中的每个方法都应该访问的引用数据。
如果您想控制构建您的用户对象,您有多种选择。对我来说最明显的两个是:
- 使用您的 InitBinder 方法添加新的自定义编辑器(PropertyEditor 类)以构建用户对象,
- 使用conversion service in Spring 3将字符串用户名转换为用户对象。
关于java - 方法中的@ModelAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335432/