Spring RequestMapping не работает без ModelAttribute

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

  • Метод 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";
}

логин.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)

person Govinda Sakhare    schedule 23.09.2015    source источник
comment
В модели должен быть объект с именем tempAdmin, при использовании @ModelAttribute это делается автоматически, в противном случае вам придется делать это вручную. Так что это не взлом, это в основном то, как это должно работать.   -  person M. Deinum    schedule 23.09.2015
comment
вернуть ModelAndView из двух других методов, т.е. appStart and logOut с вновь созданным tempAdmin в качестве modelAttribute   -  person bsingh    schedule 23.09.2015
comment
@M.Deinum Но appStart () предназначен для обработки корневого контекста, и я не отправляю никаких данных с запросом и не добавляю их в ответ. Кстати, он отлично работает с простыми тегами формы HTML.   -  person Govinda Sakhare    schedule 23.09.2015
comment
Конечно, это так, но Spring будет выполнять привязку данных и для этого требуется базовый объект формы.   -  person M. Deinum    schedule 23.09.2015
comment
Не уверен на 100%, но стоит попробовать добавить BindingResult в сигнатуру вашего метода. Он должен быть добавлен сразу после ModelAttribute: public ModelAndView doLogin(@ModelAttribute(tempAdmin) Admin tempAdmin, BindingResult bindingResult, запрос HttpServletRequest) {   -  person Fritz Duchardt    schedule 23.09.2015


Ответы (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 тоже?

person We are Borg    schedule 23.09.2015
comment
вы неправильно поняли мой вопрос. Проблема связана с методами appStart() и logout(), зачем мне там нужен modelAttribute? кстати doLogin() работает отлично, - person Govinda Sakhare; 23.09.2015
comment
Забудьте @ModelAttribute в ваших appStart() и logout(), остальное остается прежним. И зачем тогда вы публикуете этот метод контроллера, если он работает нормально?? - person We are Borg; 23.09.2015
comment
чувак, я имею в виду, зачем нам вообще нужен этот ModelAttribute в appStart() и logout(), я ничего там не привязываю, и tempAdmin там бесполезен, эти методы предназначены для перенаправления (перенаправление на требуемый jsp). Я разместил doLogin(), потому что tempAdmin потребляется этим методом. - person Govinda Sakhare; 23.09.2015
comment
Как я уже сказал, ЗАБУДЬТЕ @ModelAttribute, и я говорю вам добавить модель, а не ModelAttribute, разные вещи. Измените tempadmin на tempAdmin. - person We are Borg; 23.09.2015
comment
Кроме того, проверьте stackoverflow.com/questions/32606019/ . Проверьте ответ, который я дал, и проверьте основную ошибку сообщения ... Разве они не одинаковы? кому ты рассказываешь. - person We are Borg; 23.09.2015
comment
хорошо, но зачем мне модель? когда я использую простые html-теги, мне не нужен атрибут Model/Model в этих методах. что происходит в случае весенних тегов? - person Govinda Sakhare; 23.09.2015
comment
Кия маму!!!! Поскольку Spring должен построить объект из данных, которые вы указали в своем JSP, это просто способ указать, какой класс модели вы имеете в виду. Рекомендуется чтение библиотек Spring-tag. Кроме того, пожалуйста, проголосуйте за ответ, если он решил вашу проблему. Спасибо. Прокомментируйте, если вы не поняли Модель. - person We are Borg; 23.09.2015