복붙노트

[SPRING] BeanName에 대한 BindingResult 또는 일반 대상 객체가 요청으로 사용 가능하지 않음 attr [duplicate]

SPRING

BeanName에 대한 BindingResult 또는 일반 대상 객체가 요청으로 사용 가능하지 않음 attr [duplicate]

안녕 전문가, 위에서 언급 한 오류가 발생하는이 컨트롤러 코드가 있습니다. 어제까지 잘 작동했는데 동료가이 코드에 대해 한 단서가없고 오늘 오류가 표시됩니다.

요청 속성으로 BindingResult 나 bean 이름 'sideForm'의 일반 대상 객체를 사용할 수 없습니다.

이런 종류의 오류를 찾을 곳을 제게 알려주십시오. POST 또는 GET 메서드 선언에서 실수를하거나 잘못된 것을 반환하고 있습니까?

당신의 도움은 크게 감사합니다 :)

package com.att.analytics.ui;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.si.myworld.business.AdminChart;
import com.si.myworld.business.Chart;
import com.si.myworld.dao.AdminChartSummaryData;
import com.si.myworld.dao.BulletinData;
import com.si.myworld.dao.ChartData;

@RequestMapping("/index.html")
@Controller
public class IndexController {

private static final Logger log = Logger.getLogger(IndexController.class);

/**
 * Called to load the page initially (GET request)
 * 
 * @param model
 * @return
 */
@RequestMapping(method = RequestMethod.GET)
public String getCharts(ModelMap model) {

    Chart chart = new Chart();
    chart.setTimeline("Monthly");
    chart.setStartDt("mm/dd/yyyy");
    chart.setEndDt("mm/dd/yyyy");

    AdminChartSummaryData acsd = new AdminChartSummaryData();
    List<AdminChart> list = acsd.getLandingChartDataList();

    if (list.size() == 4) {
        Chart chart1 = new Chart(list.get(0));
        Chart chart2 = new Chart(list.get(1));
        Chart chart3 = new Chart(list.get(2));
        Chart chart4 = new Chart(list.get(3));
        model.put("chart1", chart1);
        model.put("chart2", chart2);
        model.put("chart3", chart3);
        model.put("chart4", chart4);

        log.info("chart 1>>>>" + chart1);


        ChartData cd = new ChartData();

        String chartOneDatasource = cd.fetchChartDatasourceName(chart1
                .getChartSubgroup());
        String chartTwoDatasource = cd.fetchChartDatasourceName(chart2
                .getChartSubgroup());
        String chartThreeDatasource = cd.fetchChartDatasourceName(chart3
                .getChartSubgroup());
        String chartFourDatasource = cd.fetchChartDatasourceName(chart4
                .getChartSubgroup());

        String breadcrumbOne = chart1.getChartGroup() + ">>"
                + chart1.getChartSubgroup();
        String breadcrumbTwo = chart2.getChartGroup() + ">>"
                + chart2.getChartSubgroup();
        String breadcrumbThree = chart3.getChartGroup() + ">>"
                + chart3.getChartSubgroup();
        String breadcrumbFour = chart4.getChartGroup() + ">>"
                + chart4.getChartSubgroup();


        BulletinData bd = new BulletinData();
        String bulletin = bd.getBulletinData();

        model.put("sideForm", chart);



        model.put("chartOneDatasource", chartOneDatasource);
        model.put("chartTwoDatasource", chartTwoDatasource);
        model.put("chartThreeDatasource", chartThreeDatasource);
        model.put("chartFourDatasource", chartFourDatasource);

        model.put("breadcrumbOne", breadcrumbOne);
        model.put("breadcrumbTwo", breadcrumbTwo);
        model.put("breadcrumbThree", breadcrumbThree);
        model.put("breadcrumbFour", breadcrumbFour);

        model.put("bulletin", bulletin);
    }

    return "land";
}


@RequestMapping(method = RequestMethod.POST)
public String loadCharts(HttpServletRequest request, ModelMap model, @ModelAttribute("sideForm") Chart chart) {

    String from_date = request.getParameter("startDt");
    String to_date = request.getParameter("endDt");

    chart.setStartDt(from_date);
    chart.setEndDt(to_date);

    ChartData cd = new ChartData();

    BulletinData bd = new BulletinData();
    String bulletin = bd.getBulletinData();



    AdminChartSummaryData acsd = new AdminChartSummaryData();
    List<AdminChart> list = acsd.getLandingChartDataList();
    if (list.size() == 4) {
        Chart chart1 = new Chart(list.get(0));
        Chart chart2 = new Chart(list.get(1));
        Chart chart3 = new Chart(list.get(2));
        Chart chart4 = new Chart(list.get(3));
        model.put("chart1", chart1);
        model.put("chart2", chart2);
        model.put("chart3", chart3);
        model.put("chart4", chart4);


        String chartOneDatasource = cd.fetchChartDatasourceName(chart1
                .getChartSubgroup());
        String chartTwoDatasource = cd.fetchChartDatasourceName(chart2
                .getChartSubgroup());
        String chartThreeDatasource = cd.fetchChartDatasourceName(chart3
                .getChartSubgroup());
        String chartFourDatasource = cd.fetchChartDatasourceName(chart4
                .getChartSubgroup());

        model.put("chartOneDatasource", chartOneDatasource);
        model.put("chartTwoDatasource", chartTwoDatasource);
        model.put("chartThreeDatasource", chartThreeDatasource);
        model.put("chartFourDatasource", chartFourDatasource);

        String breadcrumbOne = chart1.getChartGroup() + ">>"
                + chart1.getChartSubgroup();
        String breadcrumbTwo = chart2.getChartGroup() + ">>"
                + chart2.getChartSubgroup();
        String breadcrumbThree = chart3.getChartGroup() + ">>"
                + chart3.getChartSubgroup();
        String breadcrumbFour = chart4.getChartGroup() + ">>"
                + chart4.getChartSubgroup();


        model.put("breadcrumbOne", breadcrumbOne);
        model.put("breadcrumbTwo", breadcrumbTwo);
        model.put("breadcrumbThree", breadcrumbThree);
        model.put("breadcrumbFour", breadcrumbFour);
    }
    return "land";
}


@ModelAttribute("timeline")
public Collection<String> populateTimeline() {
    return Arrays.asList("Daily", "Weekly", "Monthly", "Quarterly",
            "Annually", "12_Month_Rolling");
}
}

이 페이지는 아래에 표시된 양식에서 값을 가져옵니다.

<form:form commandName="sideForm">
<div style="font-weight:bold; color:#000">Timeline</div>


<div style="margin:0 0 5px 0;"><form:select path="timeline" items="${timeline}" id="tm"/></div>

<div class="tofrom">From:</div>

<form:input path="startDt" id="from_date" size="7" maxlength="10" />

<div class="tofrom">To:</div>

<form:input path="endDt" id="to_date" size="7" maxlength="12" />

<input type="submit" value="Update Chart" />

</form:form>

해결법

  1. ==============================

    1.스프링 양식에 modelAttribute = "<모델 이름>"이 포함되어 있는지 확인하십시오.

    스프링 양식에 modelAttribute = "<모델 이름>"이 포함되어 있는지 확인하십시오.

    예:

    @Controller
    @RequestMapping("/greeting.html")
    public class GreetingController {
    
     @ModelAttribute("greeting")
     public Greeting getGreetingObject() {
      return new Greeting();
     }
    
     /**
      * GET
      * 
      * 
      */
     @RequestMapping(method = RequestMethod.GET)
     public String handleRequest() {
      return "greeting";
     }
    
     /**
      * POST
      * 
      * 
      */
     @RequestMapping(method = RequestMethod.POST)
     public ModelAndView processSubmit(@ModelAttribute("greeting") Greeting greeting, BindingResult result){
      ModelAndView mv = new ModelAndView();
      mv.addObject("greeting", greeting);  
      return mv;
     }
    }
    

    귀하의 JSP에서 :

    <form:form  modelAttribute="greeting" method="POST" action="greeting.html">
    
  2. ==============================

    2.연관된 컨트롤러의 GET 메소드에서 양식과 연관된 bean을 선언하고 모델에 추가해야합니다. model.addAttribute ( "uploadItem", uploadItem); @RequestMapping (method = RequestMethod.GET) 주석이 포함되어 있습니다.

    연관된 컨트롤러의 GET 메소드에서 양식과 연관된 bean을 선언하고 모델에 추가해야합니다. model.addAttribute ( "uploadItem", uploadItem); @RequestMapping (method = RequestMethod.GET) 주석이 포함되어 있습니다.

    예를 들어, UploadItem.java는 myform.jsp와 연관되고 컨트롤러는 SecureAreaController.java입니다.

    myform.jsp는 다음을 포함합니다.

    <form:form action="/securedArea" commandName="uploadItem" enctype="multipart/form-data"></form:form>
    
    @RequestMapping("/securedArea")
    @Controller
    public class SecureAreaController {
    
    @RequestMapping(method = RequestMethod.GET)
    public String showForm(Model model) {
                UploadItem uploadItem = new UploadItem(); // declareing
    
                model.addAttribute("uploadItem", uploadItem); // adding in model
        return "securedArea/upload";
    }
    
    }
    

    보시다시피 저는 컨트롤러 GET 메서드에서 UploadItem.java를 선언하고 있습니다.

  3. ==============================

    3.@ModelAttribute 주석 매개 변수가있는 @RequestMapping으로 주석 처리 된 메소드에 BindingResult 매개 변수를 추가하십시오. 각 @ModelAttribute 매개 변수 다음에 Spring은 다음 매개 변수 위치에서 BindingResult를 찾습니다 (순서는 중요 함).

    @ModelAttribute 주석 매개 변수가있는 @RequestMapping으로 주석 처리 된 메소드에 BindingResult 매개 변수를 추가하십시오. 각 @ModelAttribute 매개 변수 다음에 Spring은 다음 매개 변수 위치에서 BindingResult를 찾습니다 (순서는 중요 함).

    따라서 변경해보십시오.

    @RequestMapping (method = RequestMethod.POST) public String loadCharts (HttpServletRequest 요청, ModelMap 모델, @ModelAttribute ( "sideForm") 차트 차트) ...

  4. ==============================

    4.나는이 똑같은 문제에 대해 연구했고 정확한 이유를 발견했다고 확신한다.

    나는이 똑같은 문제에 대해 연구했고 정확한 이유를 발견했다고 확신한다.

    BeanName 'command'에 대한 BindingResult 또는 일반 대상 객체가 요청 속성으로 사용 가능하지 않습니다.

    successView 속성 값 (JSP 페이지 이름)이 입력 페이지 이름과 같으면 ModelAndView 생성자의 두 번째 값이 입력 페이지의 commandName과 일치해야합니다.

    index.jsp

    <html>
    <body>
        <table>
            <tr><td><a href="Login.html">Login</a></td></tr>
        </table>
    </body>
    </html>
    

    dispatcher-servlet.xml

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
    <bean id="urlMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>              
                <entry key="/Login.html">
                    <ref bean="userController"/>
                </entry>
            </map>          
        </property>             
    </bean>     
     <bean id="userController" class="controller.AddCountryFormController">     
           <property name="commandName"><value>country</value></property>
           <property name="commandClass"><value>controller.Country</value></property>        
           <property name="formView"><value>countryForm</value></property>
           <property name="successView"><value>countryForm</value></property>
       </bean>      
    

    AddCountryFormController.java

    package controller;
    
    import javax.servlet.http.*;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.validation.BindException;
    import org.springframework.web.servlet.mvc.SimpleFormController;
    
    
    public class AddCountryFormController extends SimpleFormController
    {
    
        public AddCountryFormController(){
            setCommandName("Country.class");
        }
    
        protected ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors){
    
                Country country=(Country)command;
    
                System.out.println("calling onsubmit method !!!!!");
    
            return new ModelAndView(getSuccessView(),"country",country);
    
        }
    
    }
    

    Country.java

    package controller;
    
    public class Country
    {
        private String countryName;
    
        public void setCountryName(String value){
            countryName=value;
        }
    
        public String getCountryName(){
            return countryName;
        }
    
    }
    

    countryForm.jsp

    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    <html>
    <body>
        <form:form commandName="country" method="POST" >
                <table>
                        <tr><td><form:input path="countryName"/></td></tr>
                        <tr><td><input type="submit" value="Save"/></td></tr>
                </table>
        </form:form>
    </body>
    <html>
    

    입력 페이지 commandName = "국가" ModelAndView 생성자로 return new ModelAndView (getSuccessView (), "country", country); 입력 페이지 의미 commandName == ModeAndView (, "commandName",)

  5. ==============================

    5.우리는 같은 문제에 직면하여이 문제를 해결하기 위해 jsp 페이지의 Attribute = ""를 모델링하기 위해 command name = ""을 변경했습니다.

    우리는 같은 문제에 직면하여이 문제를 해결하기 위해 jsp 페이지의 Attribute = ""를 모델링하기 위해 command name = ""을 변경했습니다.

  6. ==============================

    6.이 문제도 발생했습니다. 여기 내 해결책은 :

    이 문제도 발생했습니다. 여기 내 해결책은 :

    다음은 작은 Spring 애플리케이션을 실행하는 동안 발생하는 오류입니다.

    *HTTP Status 500 - 
    --------------------------------------------------------------------------------
    type Exception report
    message 
    description The server encountered an internal error () that prevented it from fulfilling this request.
    exception 
    org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/employe.jsp at line 12
    9: <form:form method="POST" commandName="command"  action="/SpringWeb/addEmploye">
    10:    <table>
    11:     <tr>
    12:         <td><form:label path="name">Name</form:label></td>
    13:         <td><form:input path="name" /></td>
    14:     </tr>
    15:     <tr>
    Stacktrace:
        org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:465)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
        org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
        org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    root cause 
    java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute
        org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
        org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
        org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
        org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
        org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)
        org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
        org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
        org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
        org.apache.jsp.WEB_002dINF.jsp.employe_jsp._jspx_meth_form_005flabel_005f0(employe_jsp.java:185)
        org.apache.jsp.WEB_002dINF.jsp.employe_jsp._jspx_meth_form_005fform_005f0(employe_jsp.java:120)
        org.apache.jsp.WEB_002dINF.jsp.employe_jsp._jspService(employe_jsp.java:80)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
        org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
        org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    note The full stack trace of the root cause is available in the Apache Tomcat/7.0.26 logs.*
    

    이 문제를 해결하려면 컨트롤러 클래스에서 다음을 수행해야합니다.

  7. from https://stackoverflow.com/questions/1069958/neither-bindingresult-nor-plain-target-object-for-bean-name-available-as-request by cc-by-sa and MIT license