Подтвердить что ты не робот

org.apache.jasper.JasperException: /WEB-INF/views/home.jsp (строка: [25], column: [1]) Невозможно найти метод setter для атрибута: [commandName]

Я создал форму весны и хочу отправить ее и отобразить другую страницу jsp. Когда я запускаю этот проект, я получаю следующее исключение. может кто-нибудь помочь мне понять, почему я получаю эту ошибку.

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)

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 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>

Когда я использую простую форму html, тогда она работает правильно, но то же самое, если я делаю это через весеннюю форму, она дает ошибку.

Класс контроллера:

@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;
    }
}
4b9b3361

Ответ 1

Какую версию Spring MVC вы используете? У меня была та же проблема, с зависимостью maven, которая,

group id: org.springframework artifact id: spring-webmvc версия: 5.0.2.RELEASE

После версии 5, commandName был удален, вместо этого вы должны использовать modelAttribute. Я нашел его здесь, https://jira.spring.io/browse/SPR-16037

Я просто изменил commandName с помощью атрибута modelAttribute.

<form:form modelAttribute="goal">

Ответ 2

commandName= имя переменной в области запроса или области сеанса, которая содержит информацию об этой форме, она должна быть.

Ссылки: http://forum.spring.io/forum/spring-projects/web/59966-exact-meaning-of-form-form-commandname

Связь с аннотацией с формой <form: form commandName = "xy"

В вашем методе GET customer который отображает (возвращает) файл jsp с формой, добавьте атрибут модели следующим образом:

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

}

затем попробуйте, если он правильно отобразит форму.

Ответ 3

Не удалось найти метод setter для атрибута: [commandName] t

В этом исключении Spring Container хочет знать, что имя, которое вы использовали как "имя_пользователя" или "modelAttribute" в теге формы jsp, этот атрибут принадлежит тому домену (классу).? это означает, что commandName="customer" клиент является экземпляром класса модели Customer. или это экземпляр других..? так что для обеспечения Spring Container вам нужно отправить Model для просмотра в свой HomeController метода welcomePage(), просто выполните это следующим образом.

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";
    }
}

У вас может быть там добавлено 2 параметра в атрибуте Model

  1. Имя атрибута, т.е. клиент
  2. Имя объекта, т.е. customerInstance

Модель представляет собой интерфейс, который является частью библиотеки Spring API, интерфейс модели. Проще говоря, модель может предоставлять атрибуты, используемые для рендеринга представлений.
Чтобы обеспечить представление полезными данными, мы просто добавляем эти данные в объект Model. Кроме того, карты с атрибутами могут быть объединены с экземплярами модели: если вы хотите узнать больше, перейдите по этой ссылке

Ответ 4

В вашем HomeController.java вам нужно отобразить вид формы с соответствующей моделью следующим образом

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

и если вы используете spring-webmvc 5 или более позднюю версию, обязательно замените commandName="customer" на modelAttribute="customer". Я надеюсь, что это решит вашу проблему.

Ответ 5

1... СТАРЫЙ ПУТЬ = имя_команды

<form:form action="index" commandName="todo">

2... NEW WAY = modelAttribute

  <form:form action="index" modelAttribute="todo">

commandName был старым способом сделать это, и в новых приложениях вы должны использовать modelAttribute