既不BindingResult也不纯目标对象bean名称“索引”可作为请求属性(Neither Bi

2019-10-16 19:06发布

试图访问控制器时,我有一个问题。

这里是我的控制器:

@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";
    }

}

这里是我的表格:

    <form:form action="index.htm" commandName="index">

        <table border="0" cellspacing="12">
            <tr>
                 <td>
                     <spring:message code="application.loginForm.email"/>
                 </td>
                 <td>
                    <form:input path="email"/>
                 </td>
                 <td class="error">
                    <form:errors path="email"/>
                 </td>
            </tr>
            <tr>
                 <td>
                     <spring:message code="application.loginForm.password"/>
                 </td>
                 <td>
                    <form:password path="password"/>
                 </td>
                 <td class="error">
                    <form:errors path="password"/>
                 </td>
            </tr>
            <tr>
                 <td>
                     <input type="submit" value="Submit"/>
                 </td>
            </tr>
        </table>

    </form:form>

在表单提交我得到这个异常:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'index' available as request attribute.

我在做什么错在这里?

Answer 1:

这是因为你只是在做此位下底部

model.put("index", loginForm);

如果从验证错误返回,或从一个成功的,有名为“指数”,让你的表单标签模型地图有没有支持对象commandName="index"间距一个合适的。

常见的解决方案是简单地做到这一点

@ModelAttribute("index")
public LoginForm getLoginForm() {
  return new LoginForm();
}

然后,总会有一个存在,并且你可以将它添加了GET方法。



文章来源: Neither BindingResult nor plain target object for bean name 'index' available as request attribute