在同一个@Controller中弹出多个@ModelAttribute方法

dro*_*dpl 3 forms spring controller model modelattribute

我在Spring MVC 3上有一个包含两种不同形式(有两个不同的提交)的页面,我遇到了@ModelAttribute方法的问题.当我在同一个控制器上有两个时,它们并不总是被执行,使模型为NULL.

代码:

@Controller
@RequestMapping(value = "/session/admin/permission/{userId}")
public class PermissionController {

    @Autowired
    private UserManager userManager;

    @ModelAttribute("passwordValidation")
    private PasswordValidation getPasswordModel(){
        return new PasswordValidation();
    }

    @ModelAttribute("user")
    private User getUserModel(@PathVariable("userId") String userId){
        //This is not executed
        return userManager.getUser(userId);
    }

    @ModelAttribute("permissionsAvailable")
    private PermissionsAvailable getPermissionsModel(@ModelAttribute("user") User user)     {
        return new PermissionsAvailable();
    }

    @RequestMapping(method = RequestMethod.GET)
    public String adminPermission(){
        return "/security/permission";
    }

    @RequestMapping(method = RequestMethod.POST, params="changeRoles")
    public String modifyPermission(@ModelAttribute("permissionsAvailable") PermissionsAvailable permissions,
            HttpServletRequest request, @ModelAttribute("user") User user, 
            final RedirectAttributes redirectAttributes){
        //Modify something
    }

    @RequestMapping(method = RequestMethod.POST, params="changePassword")
    public String modifyPassword(
            @ModelAttribute("passwordValidation") PasswordValidation passwordValidation,
            @ModelAttribute("user") User user,
            HttpServletRequest request, BindingResult bindingResult, 
            final RedirectAttributes redirectAttributes){
        return "newpage";
    }
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么,有时一切都会好,每个方法都会被执行,但有时它们不会被执行.

更新:我有两个不同的控制器具有相同的问题所以它必须是一个错误的Spring或我做错了.

谢谢.

sdo*_*ass 7

文档没有提到任何可以在@ModelAttribute注释方法的参数上使用@ModelAttribute的地方,就像你在"getPermissionsModel()"方法中所做的那样.它可能不受支持,因为它没有被记录为受支持.您可能想尝试从"getPermissionsModel()"方法中删除"@ModelAttribute("user")用户用户"参数,和/或尝试使用一个@ModelAttribute方法设置所有模型属性:

@ModelAttribute
public void setAttributes(@PathVariable("userId") String userId, Model model) {
    model.addAttribute(new PasswordValidation());
    model.addAttribute(userManager.getUser(userId));
    model.addAttribute(new PermissionsAvailable());
}
Run Code Online (Sandbox Code Playgroud)