【问题标题】:spring RequestMapping not working without ModelAttribute如果没有 ModelAttribute,spring RequestMapping 不起作用
【发布时间】:2015-09-23 06:35:19
【问题描述】:

我有具有以下请求映射方法的控制器类。

  • appStart() 方法负责将用户重定向到 login.html 和 logout() 负责使会话无效并重定向用户 回到 login.jsp
  • 如果我从它们的参数中删除 @ModelAttribute 那么这两个方法会抛出异常,是否有任何技巧可以让这些方法在没有模型属性的情况下工作?

控制器方法。

@RequestMapping(value="/",method=RequestMethod.GET) 
     public String appStart(@ModelAttribute("tempAdmin") Admin tempAdmin) {
    return "login.jsp";
}

@RequestMapping(method = RequestMethod.POST,name="doLogin")
public ModelAndView doLogin(@ModelAttribute("tempAdmin") Admin tempAdmin, HttpServletRequest request) {

    ModelAndView mvc = new ModelAndView();

    /*
        Buisness logic
    */

    mvc.setViewName("home.jsp");

    return mvc;
}

@RequestMapping("doLogout")
public String logout(HttpServletRequest request) {

    HttpSession session = request.getSession(false);
    if(session != null){
        session.invalidate();
    }

    return "login.jsp";
}

login.jsp

    <form:form action="doLogin" modelAttribute="tempAdmin" cssClass="form-horizontal">
      <div class="form-group">
          <label for="username" class="col-sm-2 control-label">Username</label>
       <div class="col-sm-10">
          <form:input cssClass="form-control" path="adminId" placeholder="username" />
        </div>
     </div>
    <div class="form-group">
         <label for="passwd" class="col-sm-2 control-label">Password</label>
    <div class="col-sm-10">
         <form:password path="password" cssClass="form-control" id="passwd" placeholder="password" />
    </div>
   </div>  
    <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-default">Sign in</button>
     </div>
   </div>
   </form:form>

堆栈跟踪。

Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'tempAdmin' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)

【问题讨论】:

  • 模型中必须有一个名为tempAdmin的对象,当使用@ModelAttribute时,它是自动完成的,否则你必须手动完成。所以这不是一个黑客,它基本上是它应该如何工作的。
  • 从其他两种方法返回 ModelAndView,即 appStart and logOut,新创建的 tempAdmin 作为 modelAttribute
  • @M.Deinum 但是 appStart() 是为了处理上下文根,我既没有通过请求发送任何数据,也没有在响应中添加它。顺便说一句,它适用于简单的 HTML 表单标签。
  • 当然可以,但是 spring 会做数据绑定,并且需要一个底层的表单对象。
  • 不是 100% 确定,但值得尝试将 BindingResult 添加到您的方法签名中。必须在 ModelAttribute 之后添加: public ModelAndView doLogin(@ModelAttribute("tempAdmin") Admin tempAdmin, BindingResult bindingResult, HttpServletRequest request) {

标签: spring spring-mvc modelattribute request-mapping


【解决方案1】:

我会告诉你如何改变你的控制器,以避免绑定结果问题。试试这个:

@RequestMapping(method = RequestMethod.POST,name="doLogin")
public String doLogin(@ModelAttribute("tempAdmin") Admin tempAdmin, HttpServletRequest request,Model model) {
    model.addAttribute("tempadmin",new Admin());
    // business logic
    return "home";
}

试试这个,如果你有任何其他类,然后添加 model.addAttribute 为好。您也可以发布您的 JSP 吗?

【讨论】:

  • 你误解了我的问题。问题在于 appStart() 和 logout() 方法为什么我需要 modelAttribute ?顺便说一句 doLogin() 工作得很好,
  • 忘记 appStart() 和 logout() 中的 @ModelAttribute,其余部分保持不变。如果它工作正常,你为什么要发布那个控制器方法呢??
  • dude 我的意思是为什么我们甚至需要在 appStart() 和 logout() 中的 ModelAttribute 我没有绑定任何东西并且 tempAdmin 在那里没有用,这些方法用于重定向目的(重定向到所需的 jsp)。我发布了 doLogin() 因为 tempAdmin 被该方法使用。
  • 就像我说的,忘记@ModelAttribute,我告诉你添加一个模型,而不是模型属性,不同的东西。将“tempadmin”更改为“tempAdmin”。
  • 另外,请检查 stackoverflow.com/questions/32606019/… 。检查我给出的答案,并检查主要的帖子错误......他们不一样吗?你告诉我。
猜你喜欢
  • 1970-01-01
  • 2012-05-02
  • 2014-01-25
  • 1970-01-01
  • 2019-07-28
  • 2020-10-10
  • 1970-01-01
  • 2013-07-26
  • 2016-03-20
相关资源
最近更新 更多