java - 方法中的@ModelAttribute

标签 java spring data-binding spring-mvc

想象一下这样的代码:

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

相关文章:

java - Android 4.4 后 IR 传输 ConsumerIrManager 类不工作

java - Extjs Grid 无法加载大数据

java - 为什么Throwable::printStackTrace持有PrintStream锁并导致回退死锁

java - 无法使用 ResourceBundleMessageSource 查找消息

c# - WPF 数据绑定(bind)的新手

java - TextView 的 Android 自定义属性

java - 用于托管 JAVA Jar 文件的进程管理器

java - 使用 AnnotationConfigApplicationContext 时禁用 Spring 日志记录

C# Xamarin - 使用 SetValueForKey 将数据绑定(bind)到 UICollectionViewCell

grails - Grails:JSON到bean-自定义字段名称