web-dev-qa-db-fra.com

Ni BindingResult ni l'objet cible simple pour le nom du bean disponible en tant qu'attribut de demande

Je viens d'apprendre les ficelles de l'annotation fu du printemps 3 et je suis tombé sur l'exception cauchemardaise de newb. J'apprécierais toute aide.

voici la forme code jsp:

  <form:form method="POST" action="login.htm" modelAttribute="login">
  ....
  <form:input path="email" size="20" />
  ....

le code du contrôleur (à ce stade, je teste simplement les eaux, donc ne vous dirigez pas vers une page, mais retourne une chaîne vide):

@Controller
@SessionAttributes
public class LoginController {

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(    @ModelAttribute("login") Login login,
                        BindingResult result) {

    System.out.println(" email entered "+ login.getEmail()+ "\n");
    return "test";
}

"Login" est un haricot de formulaire avec le setter et les accesseurs appropriés.

je suppose que ce morceau de code dans mon servlet de répartiteur devrait prendre en charge le balayage des annotations:

<context:component-scan
    base-package="com.testAnnFu.controller" />

et c’est l’exception honteuse qui est lancée lorsque j’essaie de charger ma page jsp d’atterrissage.

SEVERE: Neither BindingResult nor plain target object for bean name 'login' available as request attribute
Java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'login' available as request attribute
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.Java:141)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.Java:174)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.Java:194)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.Java:160)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.Java:147)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.Java:138)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.Java:122)
    at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.Java:408)
    at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.Java:140)
    at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.Java:102)
    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.Java:79)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspx_meth_form_input_0(landing_jsp.Java from :208)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspx_meth_form_form_0(landing_jsp.Java from :164)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspService(landing_jsp.Java from :107)
    at org.Apache.jasper.runtime.HttpJspBase.service(HttpJspBase.Java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:403)
    at org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:492)
    at org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1539)
    at org.Apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.Java:787)
    at org.Apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.Java:649)
    at org.Apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.Java:483)
    at org.Apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.Java:454)
    at org.Apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.Java:350)
    at org.Apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.Java:300)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.Java:238)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.Java:250)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.Java:1047)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:817)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:669)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:574)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:734)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1539)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:281)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:175)
    at org.Apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.Java:655)
    at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:595)
    at com.Sun.enterprise.web.WebPipeline.invoke(WebPipeline.Java:98)
    at com.Sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.Java:91)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:162)
    at org.Apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.Java:330)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:231)
    at com.Sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.Java:174)
    at com.Sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.Java:828)
    at com.Sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.Java:725)
    at com.Sun.grizzly.http.ProcessorTask.process(ProcessorTask.Java:1019)
    at com.Sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.Java:225)
    at com.Sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.Java:137)
    at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:104)
    at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:90)
    at com.Sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.Java:79)
    at com.Sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.Java:54)
    at com.Sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.Java:59)
    at com.Sun.grizzly.ContextTask.run(ContextTask.Java:71)
    at com.Sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.Java:532)
    at com.Sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.Java:513)
    at Java.lang.Thread.run(Thread.Java:680)

WARNING: ApplicationDispatcher[/sssmgt] PWC1231: Servlet.service() for servlet jsp threw exception
Java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'login' available as request attribute
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.Java:141)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.Java:174)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.Java:194)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.Java:160)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.Java:147)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.Java:138)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.Java:122)
    at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.Java:408)
    at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.Java:140)
    at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.Java:102)
    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.Java:79)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspx_meth_form_input_0(landing_jsp.Java from :208)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspx_meth_form_form_0(landing_jsp.Java from :164)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspService(landing_jsp.Java from :107)
    at org.Apache.jasper.runtime.HttpJspBase.service(HttpJspBase.Java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:403)
    at org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:492)
    at org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1539)
    at org.Apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.Java:787)
    at org.Apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.Java:649)
    at org.Apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.Java:483)
    at org.Apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.Java:454)
    at org.Apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.Java:350)
    at org.Apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.Java:300)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.Java:238)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.Java:250)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.Java:1047)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:817)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:669)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:574)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:734)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1539)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:281)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:175)
    at org.Apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.Java:655)
    at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:595)
    at com.Sun.enterprise.web.WebPipeline.invoke(WebPipeline.Java:98)
    at com.Sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.Java:91)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:162)
    at org.Apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.Java:330)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:231)
    at com.Sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.Java:174)
    at com.Sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.Java:828)
    at com.Sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.Java:725)
    at com.Sun.grizzly.http.ProcessorTask.process(ProcessorTask.Java:1019)
    at com.Sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.Java:225)
    at com.Sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.Java:137)
    at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:104)
    at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:90)
    at com.Sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.Java:79)
    at com.Sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.Java:54)
    at com.Sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.Java:59)
    at com.Sun.grizzly.ContextTask.run(ContextTask.Java:71)
    at com.Sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.Java:532)
    at com.Sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.Java:513)
    at Java.lang.Thread.run(Thread.Java:680)

WARNING: StandardWrapperValve[dispatcher]: PWC1406: Servlet.service() for servlet dispatcher threw exception
Java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'login' available as request attribute
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.Java:141)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.Java:174)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.Java:194)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.Java:160)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.Java:147)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.Java:138)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.Java:122)
    at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.Java:408)
    at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.Java:140)
    at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.Java:102)
    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.Java:79)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspx_meth_form_input_0(landing_jsp.Java from :208)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspx_meth_form_form_0(landing_jsp.Java from :164)
    at org.Apache.jsp.WEB_002dINF.jsp.landing_jsp._jspService(landing_jsp.Java from :107)
    at org.Apache.jasper.runtime.HttpJspBase.service(HttpJspBase.Java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:403)
    at org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:492)
    at org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:378)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1539)
    at org.Apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.Java:787)
    at org.Apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.Java:649)
    at org.Apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.Java:483)
    at org.Apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.Java:454)
    at org.Apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.Java:350)
    at org.Apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.Java:300)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.Java:238)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.Java:250)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.Java:1047)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:817)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:669)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:574)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:734)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:847)
    at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1539)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:281)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:175)
    at org.Apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.Java:655)
    at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:595)
    at com.Sun.enterprise.web.WebPipeline.invoke(WebPipeline.Java:98)
    at com.Sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.Java:91)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:162)
    at org.Apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.Java:330)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:231)
    at com.Sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.Java:174)
    at com.Sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.Java:828)
    at com.Sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.Java:725)
    at com.Sun.grizzly.http.ProcessorTask.process(ProcessorTask.Java:1019)
    at com.Sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.Java:225)
    at com.Sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.Java:137)
    at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:104)
    at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:90)
    at com.Sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.Java:79)
    at com.Sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.Java:54)
    at com.Sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.Java:59)
    at com.Sun.grizzly.ContextTask.run(ContextTask.Java:71)
    at com.Sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.Java:532)
    at com.Sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.Java:513)
    at Java.lang.Thread.run(Thread.Java:680)

J'ai coupé la partie form: input et j'avais une page nue jsp, qui semble se charger. ce n'est que lorsque j'introduis les entrées que les choses vont mal.

je sais qu'il y a quelque chose qui cloche dans ma compréhension de la façon dont tout ce processus d'annotation est câblé et mappé à ModelAttribute. J'ai fouillé dans toutes les combinaisons et les publications dans StOv pour des exceptions similaires, mais j'ai clairement raté quelque chose. Quelqu'un pourrait-il avoir la gentillesse de signaler mon erreur ici?

87
Kaushik Gopal

Dans le contrôleur, vous devez ajouter l'objet de connexion en tant qu'attribut du modèle:

model.addAttribute("login", new Login());

Comme ça:

@RequestMapping(value = "/", method = RequestMethod.GET) 
public String displayLogin(Model model) { 
    model.addAttribute("login", new Login()); 
    return "login"; 
}
137
Vinay

Vous auriez eu cette exception en faisant une GET sur http://localhost:8080/projectname/login

Comme Vinay l’a bien dit, vous pouvez certainement utiliser

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String displayLogin(Model model) { 
    model.addAttribute("login", new Login()); 
    return "login"; 
}

Mais je vais vous proposer une syntaxe alternative que vous avez essayée avec Spring 3.0.

Vous pouvez également obtenir les fonctionnalités ci-dessus avec

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String displayLogin(Login loginModel) { 
    return "login"; 
}

et il login.jsp (en supposant que vous utilisez InternalResourceViewResolver) vous pouvez avoir

<form:form method="POST" action="login.htm" modelAttribute="login">

Notice: modelAttribute est login et non loginModel. C'est selon le nom de la classe que vous fournissez en argument. Mais si vous voulez utiliser loginModel comme modelAttribute is jsp, vous pouvez procéder comme suit

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String displayLogin(@ModelAttribute("loginModel")Login loginModel) { 
    return "login"; 
}

et jsp aurait

<form:form method="POST" action="login.htm" modelAttribute="loginModel">

Je sais qu'il y a juste différentes façons de faire la même chose. Mais le point le plus important à noter ici -

Imp Note: Lorsque vous ajoutez votre classe de modèle dans l'argument de votre méthode (comme public String displayLogin(Login loginModel)), il est automatiquement créé et ajouté à votre objet Model (c'est pourquoi vous pouvez y accéder directement sans JSP). le mettre manuellement dans le modèle). Ensuite, il recherchera votre demande si celle-ci possède des attributs qu'il peut mapper avec le nouveau modèle ModelObject créé. Si c'est le cas, Spring injectera les valeurs des paramètres de demande dans votre classe d'objet de modèle personnalisé (dans ce cas, identifiez-vous).

Vous pouvez tester cela en faisant

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String displayLogin(Login loginModel, Model model) { 
    System.out.println(model.asMap().get("login").equals(loginModel));
    return "login"; 
}

Note: La création ci-dessus d'un nouvel objet de modèle personnalisé peut ne pas être vraie si vous avez donné @SessionAttributes({"login"}). Dans ce cas, il obtiendra de session et peuplera des valeurs.

10
Aniket Thakur

J'ai eu un problème comme celui-ci, mais avec plusieurs "actions". Ma solution ressemble à ceci:

    <form method="POST" th:object="${searchRequest}" action="searchRequest" >
          <input type="text" th:field="*{name}"/>
          <input type="submit" value="find" th:value="find" />
    </form>
        ...
    <form method="POST" th:object="${commodity}" >
        <input type="text" th:field="*{description}"/>
        <input type="submit" value="add" />
    </form>

Et contrôleur

@Controller
@RequestMapping("/goods")
public class GoodsController {
    @RequestMapping(value = "add", method = GET)
    public String showGoodsForm(Model model){
           model.addAttribute(new Commodity());
           model.addAttribute("searchRequest", new SearchRequest());
           return "goodsForm";
    }
    @RequestMapping(value = "add", method = POST)
    public ModelAndView processAddCommodities(
            @Valid Commodity commodity,
            Errors errors) {
        if (errors.hasErrors()) {
            ModelAndView model = new ModelAndView("goodsForm");
            model.addObject("searchRequest", new SearchRequest());
            return model;
        }
        ModelAndView model = new ModelAndView("redirect:/goods/" + commodity.getName());
        model.addObject(new Commodity());
        model.addObject("searchRequest", new SearchRequest());
        return model;
    }
    @RequestMapping(value="searchRequest", method=POST)
    public String processFindCommodity(SearchRequest commodity, Model model) {
    ...
        return "catalog";
    }

Je suis sûr - il ne s'agit pas d'une "meilleure pratique", mais cela fonctionne sans "ni BindingResult ni objet cible simple pour le nom du bean disponible en tant qu'attribut de demande".

1

Si vous avez passé l'objet Model ou transfer à la méthode GET mais que l'erreur persiste, vérifiez le nommage de vos variables. Utilisez les noms d’entité/d’objet de transfert dans camelcase. J'avais un objet BusinessTripDTO que je nommais "trip". Cette erreur est survenue même si toutes les autres pièces étaient en place. Renommer varaibles en businessTripDTO dans Java et Thymeleaf ont résolu ce problème pour moi.

0
jarosik

la première fois que vous renvoyez votre formulaire, assurez-vous de passer le modèleattribut le formulaire requis, ce qui peut être fait en ajoutant le code ci-dessous

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(Login login)
    return "test";
}

Par défaut, le nom de l'attribut de modèle est pris comme nom de la classe de bean avec la première lettre minuscule.

En faisant cela, le formulaire qui attend un objet de support nommant "login" sera mis à sa disposition

une fois le formulaire soumis, vous pouvez effectuer la validation en transmettant votre objet bean et bindingresult en tant que paramètres de la méthode, comme indiqué ci-dessous.

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(    @ModelAttribute("login") Login login,
                        BindingResult result) 
0
unknown

Il suffit d'ajouter

model.addAttribute("login", new Login());

à votre méthode ..

ça va marcher..

0
Reddeiah Pidugu

J'ai eu un problème similaire dans IntelliJ IDEA. Mon code était correct à 100%, mais après le démarrage de Tomcat, vous recevez une exception. Java.lang.IllegalStateException: ni BindingResult

Je viens de retirer et d'ajouter de nouveau la configuration Tomcat. Et cela a fonctionné pour moi.

Une image de la configuration Tomcat

enter image description here

0
Slava