web-dev-qa-db-fra.com

org.Apache.jasper.JasperException: /WEB-INF/views/home.jsp (ligne: [25], colonne: [1]) Impossible de trouver la méthode de définition pour l'attribut: [nomCommande].

J'ai créé un formulaire printanier et je souhaite l'envoyer et afficher une autre page jsp. Lorsque je lance ce projet, je reçois l'exception ci-dessous. Quelqu'un peut-il m'aider à comprendre pourquoi je reçois cette erreur?.

org.Apache.jasper.JasperException: /WEB-INF/views/home.jsp (line: [25], column: [1]) Unable to find setter method for attribute: [commandName]
    org.Apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.Java:42)
    org.Apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.Java:292)
    org.Apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.Java:115)
    org.Apache.jasper.compiler.Generator$GenerateVisitor.evaluateAttribute(Generator.Java:2998)
    org.Apache.jasper.compiler.Generator$GenerateVisitor.generateSetters(Generator.Java:3218)
    org.Apache.jasper.compiler.Generator$GenerateVisitor.generateCustomStart(Generator.Java:2404)
    org.Apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.Java:1894)
    org.Apache.jasper.compiler.Node$CustomTag.accept(Node.Java:1544)
    org.Apache.jasper.compiler.Node$Nodes.visit(Node.Java:2389)
    org.Apache.jasper.compiler.Node$Visitor.visitBody(Node.Java:2441)
    org.Apache.jasper.compiler.Node$Visitor.visit(Node.Java:2447)
    org.Apache.jasper.compiler.Node$Root.accept(Node.Java:470)
    org.Apache.jasper.compiler.Node$Nodes.visit(Node.Java:2389)
    org.Apache.jasper.compiler.Generator.generate(Generator.Java:3657)
    org.Apache.jasper.compiler.Compiler.generateJava(Compiler.Java:256)
    org.Apache.jasper.compiler.Compiler.compile(Compiler.Java:384)
    org.Apache.jasper.compiler.Compiler.compile(Compiler.Java:361)
    org.Apache.jasper.compiler.Compiler.compile(Compiler.Java:345)
    org.Apache.jasper.JspCompilationContext.compile(JspCompilationContext.Java:603)
    org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:369)
    org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:385)
    org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:329)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:741)
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:53)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.Java:170)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.Java:312)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.Java:1325)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.Java:1069)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:1008)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:925)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:978)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:870)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:634)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:855)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:741)
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:53)

Fichier JSP:

<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
    <title>Home</title>
    <style>
.error {
    color: #ff0000;
}

.errorblock {
    color: #000;
    background-color: #ffEEEE;
    border: 3px solid #ff0000;
    padding: 8px;
    margin: 16px;
}
</style>
</head>
<body>
<h2>Spring's form textbox example</h2>

    <form:form method="POST" action="/customer" commandName="customer">
        <form:errors path="*" cssClass="errorblock" element="div" />
        <table>
            <tr>
                <td>Username :</td>
                <td><form:input path="userName" />
                </td>
                <td><form:errors path="userName" cssClass="error" />
                </td>
            </tr>
            <tr>
                <td colspan="3"><input type="submit" />
                </td>
            </tr>
        </table>
    </form:form>

</html>

Lorsque j'utilise une forme HTML simple, cela fonctionne correctement, mais la même chose si je la fais par le biais d'une forme printanière donne l'erreur. 

Classe de contrôleur:

@Controller
public class HomeController {


    @RequestMapping("/")
    public String welcomePage()
    {
        return "home";
    }


    @RequestMapping(value="/customer", method=RequestMethod.POST)
    public ModelAndView submitForm(@RequestParam("userName") String name)
    {       
        ModelAndView mv = new ModelAndView("success");
        mv.addObject("userName", name);
        return mv;
    }
}
12
Swetamber

Quelle version de Spring MVC utilisez-vous? J'ai eu le même problème, avec la dépendance maven qui est,

identifiant du groupe: org.springframework Identifiant d'artefact: spring-webmvc version: 5.0.2.RELEASE

Après la version 5, commandName a été supprimé, vous devez plutôt utiliser modelAttribute. Je l'ai trouvé ici, https://jira.spring.io/browse/SPR-16037

J'ai simplement changé le commandName avec modelAttribute.

<form:form modelAttribute="goal">
34
Oguz

commandName = nom d'une variable de la portée de la requête ou de la session contenant les informations sur ce formulaire, il devrait s'agir d'un été.

Références: http://forum.spring.io/forum/spring-projects/web/59966-exact-meaning-of-form-form-form-commandname

Relation d'annotation de printemps avec <form: form nomCommande = "xy"

Dans votre méthode GET de customer qui affiche (renvoie) le fichier jsp avec le formulaire, ajoutez un attribut de modèle comme suit:

@RequestMapping(value="/customer", method=RequestMethod.GET)
    public ModelAndView showForm(Model model) {
        model.addAttribute("customer",new Customer());

}

puis essayez s'il affiche le formulaire correctement.

1
Sumit Badaya

Impossible de trouver la méthode de définition pour l'attribut: [nom de la commande] t 

Dans cette exception, Spring Container veut savoir que le nom que vous avez utilisé en tant que "nom de commande" ou "modelAttribute" dans une balise de formulaire jsp, cet attribut appartient à quel domaine (classe).? cela signifie que le commandName="customer" le client est instanceOf classe de modèle client. ou c'est exemple d'un autre ..? de sorte que pour garantir le conteneur Spring, vous devez envoyer Model à afficher dans votre méthode HomeController of welcomePage (), procédez comme suit.

import org.springframework.ui.Model;
@Controller
public class HomeController {

    @RequestMapping("/")
    public String welcomePage(Model model)
    {
        /* i am not sure what would be youe Model name for customer change that accord to your model name */
        Customer customerInstance = new Customer();
        model.addAttribute("customer", customerInstance);
        return "home";
    }
}

Vous pouvez y ajouter 2 paramètres dans l'attribut Model. 

  1. Nom d'attribut i.e client
  2. Nom d'objet i.e customerInstance

Le modèle est une interface faisant partie de la bibliothèque Spring API, L'interface du modèle En d'autres termes, le modèle peut fournir des attributs utilisés pour le rendu des vues.
Pour fournir une vue avec des données utilisables, nous ajoutons simplement ces données à son objet Model. En outre, les mappes avec des attributs peuvent être fusionnées avec des instances de modèle: Si vous souhaitez en savoir plus, accédez à ce lien

0
nSense