代码之家  ›  专栏  ›  技术社区  ›  AMA

bindingResult和bean名称的纯目标对象都不能作为请求attr[duplicate]使用

  •  33
  • AMA  · 技术社区  · 16 年前

    专家, 我有这个控制器代码,它引发了上述错误。到昨天为止一切正常,我不知道同事对这段代码做了什么,今天我看到了错误:

    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>
    
    6 回复  |  直到 8 年前
        1
  •  37
  •   sth    15 年前

    确保您的spring表单中提到 modelAttribute="<Model Name" .

    例子:

    @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
  •  25
  •   Jens    9 年前

    确保在关联控制器的get方法中声明与表单关联的bean,并将其添加到模型中 model.addAttribute("uploadItem", uploadItem); 其中包含 @RequestMapping(method = RequestMethod.GET) 注释。

    例如,uploaditem.java与myform.jsp关联,controller是secureareacontroller.java

    myform.jsp包含

    <form:form action="/securedArea" commandName="uploadItem" enctype="multipart/form-data"></form:form>
    

    myformcontroller.java

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

    如您所见,我正在controller get方法中声明uploaditem.java。

        3
  •  6
  •   Rob Beardow    15 年前

    尝试将bindingResult参数添加到用 @RequestMapping 哪个有 @ModelAttribute 带注释的参数。后各 @模型属性 参数,spring在下一个参数位置查找bindingResult(顺序很重要)。

    所以尝试改变:

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

    到:

    @RequestMapping(method = RequestMethod.POST)
    public String loadCharts(@ModelAttribute("sideForm") Chart chart, BindingResult bindingResult, HttpServletRequest request, ModelMap model) 
    ...
        4
  •  4
  •   forsvarir    12 年前

    我在同一个问题上工作过,我确信我已经找到了它的确切原因。

    bindingResult和bean名'command'的纯目标对象都不能作为请求属性使用

    如果successview属性值(jsp页面的名称)与输入页面的名称相同,那么modelandview构造函数的第二个值必须与输入页面的commandname匹配。

    例如。

    索引文件

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

    国家爪哇

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

    国家窗体.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="country" ModelAndView Constructor as return new ModelAndView(getSuccessView(),"country",country); 表示输入页 commandName==ModeAndView(,"commandName",)

        5
  •  0
  •   m00am    8 年前

    我们面对同样的问题,改变了 commandname="" modelAttribute="" 在jsp页面中解决这个问题。

        6
  •  -1
  •   Jens    9 年前

    我也遇到过这个问题。以下是我的解决方案:

    下面是运行小型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.*
    

    为了解决此问题,您需要在控制器类中执行以下操作:

    1. 将导入包更改为“ import org.springframework.web.portlet.ModelAndView; “ “ import org.springframework.web.servlet.ModelAndView; “……”
    2. 重新编译并运行代码…这个问题应该得到解决。