Java bean name';的BindingResult或普通目标对象;指数';可用作请求属性

Java bean name';的BindingResult或普通目标对象;指数';可用作请求属性,java,spring,spring-mvc,Java,Spring,Spring Mvc,我在尝试访问控制器时遇到问题 这是我的控制器: @Controller @RequestMapping("/index.htm") public class LoginController { @Autowired private UserService userService; @RequestMapping(method = RequestMethod.GET) public String showForm(Map model) { mod

我在尝试访问控制器时遇到问题

这是我的控制器:

@Controller
@RequestMapping("/index.htm")
public class LoginController {

    @Autowired
    private UserService userService;

    @RequestMapping(method = RequestMethod.GET)
    public String showForm(Map model) {
        model.put("index", new LoginForm());
        return "index";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processForm(LoginForm loginForm, BindingResult result,
                              Map model) {

        if (result.hasErrors()) {
            HashMap<String, String> errors = new HashMap<String, String>();
            for (FieldError error : result.getFieldErrors()) {
                errors.put(error.getField(), error.getDefaultMessage());
            }
            model.put("errors", errors);
            return "index";
        }

        List<User> users = userService.getUsers();
        loginForm = (LoginForm) model.get("loginForm");

        for (User user : users) {
            if (!loginForm.getEmail().equals(user.getEmail()) || !loginForm.getPassword().equals(user.getPassword())) {
                return "index";
            }
        }

        model.put("index", loginForm);
        return "loginsuccess";
    }

}

我做错了什么?

这是因为你只在底部做这一点

model.put("index", loginForm);
如果从验证错误或成功返回,则在名为“index”的模型映射中没有支持对象,因此具有
commandName=“index”
的表单标记会匹配

一个常见的解决方案就是这样做

@ModelAttribute("index")
public LoginForm getLoginForm() {
  return new LoginForm();
}
然后总会有一个存在,您可以从GET方法中添加它

model.put("index", loginForm);
@ModelAttribute("index")
public LoginForm getLoginForm() {
  return new LoginForm();
}