3

我在 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";
    }
}

不知道为什么,有时一切正常,每个方法都执行了,但有时它们没有执行。

更新:我有两个不同的控制器有同样的问题,所以它一定是 Spring 上的错误或者我做错了什么。

谢谢。

4

1 回答 1

7

该文档没有提到可以在 @ModelAttribute 注释方法的参数上使用 @ModelAttribute 的任何地方,就像您在“getPermissionsModel()”方法中所做的那样。这可能不受支持,因为它没有被记录为受支持。您可能想尝试从“getPermissionsModel()”方法中删除“@ModelAttribute("user") User 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());
}
于 2013-05-25T21:11:30.253 回答