【问题标题】:Exclude Spring Controller method from model binding through annotated @ModelAttribute method通过注解的 @ModelAttribute 方法从模型绑定中排除 Spring Controller 方法
【发布时间】:2013-02-06 19:24:58
【问题描述】:

我收到了对方法 getIndex 的无效请求,因为缺少请求参数 id。我可以指定我不希望该请求映射方法的模型绑定吗?

@Controller
@RequestMapping ("/admin/admins")
public class AdminUserController {
@RequestMapping (method = RequestMethod.GET)
    public String getIndex(ModelMap model) {
        model.addAttribute("admins",userService.findAllAdmins());
        return "admin/admins/list";
    }

@ModelAttribute("user")
    public AdminUser getAdminUser(@RequestParam("id") Integer id) {
        return userService.findAdminById(id);
    }




    @RequestMapping (method = RequestMethod.POST) 
    public String registerAdmin(@Valid @ModelAttribute("user") AdminUser user, BindingResult bindingResult, ModelMap model)  {

        model.addAttribute("roles", userRoleService.findAll());
        if (bindingResult.hasErrors()) {
            return "admin/admins/form";
        } 
        else if (!user.getPassword().equals(user.getConfirmPassword())) {
            bindingResult.addError(new FieldError("user","confirmPassword", "Passwords don't match"));
            return "admin/admins/form";
        }
        else {
            user.setPassword(passwordEncoder.encodePassword(user.getPassword(), null));
            try {
                userService.save(user);
                return "redirect:/admin/admins";
            } catch(ApplicationException ce) {
                bindingResult.addError(new FieldError("user", "email", "Email already registered"));
                return "admin/admins/form";
            }

        }

    }

【问题讨论】:

  • 您的意思是您收到了对getAdminUser() 方法的无效请求?用getIndex 得到它是没有意义的。
  • HTTP 状态 400 - 当我尝试获取用户 getIndex() 列表时,必需的整数参数“id”不存在
  • 没错,就是方法getAdminUser()而不是getIndex()
  • 是的..但是绑定是在每个requestmapping方法之前执行的,我可以排除getIndex吗?
  • 只是为了清除它抱歉..使用spring 3.2,新方法注释@ModelAttribute..static.springsource.org/spring/docs/3.2.x/…

标签: java spring spring-mvc


【解决方案1】:

您可以将 id 参数设为可选

@ModelAttribute("user")
public AdminUser getAdminUser(@RequestParam(value="id", required=false) Integer id) {
    if(id==null){
        return new AdminUser();
    }
    return userService.findAdminById(id);
}

编辑:或松开 ModelMap 参数:

@RequestMapping (method = RequestMethod.GET)
public ModelAndView getIndex() {
    return new ModelAndView("admin/admins/list", "admins",userService.findAllAdmins());
}

【讨论】:

  • 非常感谢!那会是一个好习惯吗?无论我在模型中是否需要它,它都会在每个请求上创建一个新的 AdminUser 对象,对吗?我是 Spring 新手,我应该将 getIndex 方法移到另一个控制器吗?
猜你喜欢
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2012-12-20
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多