2015-09-23 5 views
0

У меня есть класс контроллера со следующим методом сопоставления запросов. Метод
spring RequestMapping не работает без ModelAttribute

  • AppStart() отвечает за перенаправление пользователя login.html и выход из системы() отвечает за сеанс недействительности и перенаправление пользователя обратно Login.jsp
  • если удалить @ModelAttribute из их параметр, то эти два метода бросают исключение, есть ли какой-либо взлом, чтобы эти методы работали без атрибута 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> 

StackTrace.

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) 
+0

В модели должен быть объект с именем 'tempAdmin', при использовании' @ ModelAttribute', который выполняется автоматически, иначе вы будете делать это вручную. Так что это не хак, это в основном то, как он должен работать. –

+0

return ModelAndView из других двух методов, то есть 'appStart и logOut' с недавно созданным tempAdmin как modelAttribute – bsingh

+0

@ M.Deinum Но appStart() предназначен для обработки контекстного корня, и я не отправляю никаких данных с запросом и не добавляю их в ответ , Кстати, он отлично работает с простыми тегами HTML-формы. – piechuckerr

ответ

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?

+0

вы неправильно поняли мой вопрос.используете метод appStart() и logout(), почему Мне нужна модельАтрибут? btw doLogin() работает отлично, – piechuckerr

+0

Забудьте @ModelAttribute в appStart() и logout(), остальное останется таким же. И почему вы отправляете этот метод контроллера, если он работает нормально? –

+0

Чувак Я имею в виду, почему нам даже нужен этот ModelAttribute в appStart() и logout() Я ничего не связываю и там tempAdmin бесполезен, эти методы предназначены для перенаправления (перенаправление на требуемый jsp). Я опубликовал doLogin(), потому что tempAdmin потребляется этим методом. – piechuckerr

Смежные вопросы