【问题标题】:Spring BindingResult Error [duplicate]Spring BindingResult错误[重复]
【发布时间】:2011-05-06 18:49:48
【问题描述】:

我收到以下错误消息:

java.lang.IllegalStateException: Neither BindingResult 
nor plain target object for bean name 'billingInfoCommand' 
available as request attribute

我的 JSP 看起来像:

    <form:form commandName="billingInfoCommand" method="post" 
onsubmit="return checkVals()">

我的控制器看起来像:

public class BillingInfoController extends FusionFormController {
    protected final Log logger = LogFactory.getLog(getClass());
    private FieldAccessService fieldAccessService;

        public BillingInfoController(){
        setCommandClass(CommonCommand.class);
        setCommandName("billingInfoCommand");
    }

   protected Map referenceData(HttpServletRequest request,Object command, Errors errors) throws Exception {

        CommonCommand commonCommand=(CommonCommand)command;
        HashMap<String,Object> refDataMap=new HashMap<String,Object>();
        refDataMap.put("billingTypes",this.getLookupValsAsMap("getBillingTypes"));
        Long stageId=commonCommand.getEmeaMain().getStageId();
        refDataMap.put("requiredFields",requiredFields);
        return refDataMap;
    }


  public Object formBackingObject(HttpServletRequest request){
        BillingInfo billingInfoObj=null;
        Long cepWorkItemNo=null;
        CommonCommand billingInfoCommand=new CommonCommand();
        try{
         cepWorkItemNo=new Long(request.getParameter("cep_work_item_no"));
        }catch(NumberFormatException e){
        }
        if(cepWorkItemNo==null){
           billingInfoObj=new BillingInfo();
        }else{
          billingInfoObj=(BillingInfo)domainService.getDomainObject(BillingInfo.class,cepWorkItemNo);
        }
        if(billingInfoCommand.getBillingInfo()==null)
           billingInfoCommand.setBillingInfo(billingInfoObj);
        if(billingInfoCommand.getEmeaMain()==null)
            billingInfoCommand.setEmeaMain(emeaMain);
        return billingInfoCommand;
   }
}

我的 Pojo 类看起来像:

public class BillingInfo {

    private Integer billingId;

    public Integer getBillingId() {
        return billingId;
    }
    public void setBillingId(Integer billingId) {
        this.billingId = billingId;
    }
}

注意

我在这里只发布了相关的代码。我不确定为什么我会提到有关 IllegalStateException 的错误,并且一些有用的指针将不胜感激。

另外,出现Neither BindingResult nor plain target object for bean name x available as request attribute 错误的正常原因是什么?

全栈跟踪

 - java.lang.IllegalStateException:
   Neither BindingResult nor plain
   target object for bean name
   'billingInfoCommand' available as
   request attribute
       java.lang.IllegalStateException: Neither BindingResult nor plain
   target object for bean name
   'billingInfoCommand' available as
   request attribute at
   org.springframework.web.servlet.support.BindStatus.(BindStatus.java:148)
   at
   org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:179)
   at
   org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.resolveCssClass(AbstractHtmlElementTag.java:404)
   at
   org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:380)
   at
   org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
   at
   org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:90)
   at
   org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:77)
   at
   org.apache.jsp.WEB_002dINF.jsp.globalecep.ap.billing_005finfo_jsp._jspx_meth_form_005flabel_005f0(billing_005finfo_jsp.java:1243)
   at
   org.apache.jsp.WEB_002dINF.jsp.globalecep.ap.billing_005finfo_jsp._jspService(billing_005finfo_jsp.java:363)
   at
   org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
   at
   javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
   at
   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
   at
   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
   at
   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
   at
   javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
   at
   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
   at
   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
   at
   org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659)
   at
   org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:565)
   at
   org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:493)
   at
   org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:965)
   at
   org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:600)
   at
   org.apache.struts.tiles.TilesUtilImpl.doInclude(TilesUtilImpl.java:137)
   at
   org.apache.struts.tiles.TilesUtil.doInclude(TilesUtil.java:177)
   at
   org.apache.struts.taglib.tiles.InsertTag.doInclude(InsertTag.java:756)
   at
   org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:881)
   at
   org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:473)
   at
   org.apache.jsp.WEB_002dINF.fusion.jsp.tab_005ftemplate_jsp._jspx_meth_tiles_005finsert_005f2(tab_005ftemplate_jsp.java:1807)
   at
   org.apache.jsp.WEB_002dINF.fusion.jsp.tab_005ftemplate_jsp._jspService(tab_005ftemplate_jsp.java:307)
   at
   org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
   at
   javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
   at
   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
   at
   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
   at
   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
   at
   javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
   at
   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
   at
   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
   at
   org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659)
   at
   org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:457)
   at
   org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
   at
   org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
   at
   org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:145)
   at
   org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251)
   at
   org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1144)
   at
   org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:880)
   at
   org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:793)
   at
   org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
   at
   org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
   at
   javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
   at
   javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
   at
   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
   at
   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
   at
   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
   at
   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
   at
   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
   at
   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
   at
   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
   at
   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
   at
   org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
   at
   org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
   at
   org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
   at
   org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
   at
   org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
   at
   java.lang.Thread.run(Thread.java:595)

Servlet 配置映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">


    <bean id="apbillingInfoController" class="ap.BillingInfoController">
      <property name="queryService" ref="queryService" />
      <property name="domainService" ref="domainService" />
      <property name="formView" value="ap_billinginfo"/>
      <property name="validator" ref="apbillingInfoValidator" />
      <property name="fieldAccessService"  ref="fieldAccessService"/>
    </bean>

    <bean id="apbillingInfoValidator"  class="validator.ap.BillingInfoValidator">
           <property name="queryService" ref="queryService" />
    </bean>

    <bean id="apcompanyBillingInfoController" class="ap.company.COMPANYBillingInfoController">
      <property name="commandName"   value="companyBillingInfoBean"/>
      <property name="commandClass"  value="command.ap.company.COMPANYCommonCommand"/>
      <property name="queryService" ref="queryService" />
      <property name="domainService" ref="domainService" />
      <property name="formView" value="ap_companybillinginfo"/>
      <property name="validator" ref="apcompanyBillingInfoValidator" />
      <property name="fieldAccessService"  ref="fieldAccessService"/>
    </bean>

    <bean id="apcompanyBillingInfoValidator"  class="validator.ap.company.COMPANYBillingInfoValidator">
        <property name="fieldAccessService"  ref="fieldAccessService"/>
       <property name="queryService" ref="queryService" />
    </bean>
      <property name="mappings">
        <props>
          <prop key="/ap_billing.htm">apbillingInfoController</prop>
        </props>
      </property>
    </bean>

      <property name="mappings">
        <props>
          <prop key="/company_ap_billing.htm">apcompanyBillingInfoController</prop>
        </props>
      </property>
    </bean>
</beans>

谢谢。

【问题讨论】:

  • 什么是BillingInfoController
  • 它是我的控制器类,让我更新代码以将其包含在其中。
  • @skaffman-已更新问题并在其中包含BillingInfoController
  • @SO 用户:这个问题不清楚吗?
  • 另外,如果有人能从解释的角度解释为什么会出现这种错误,那也是非常有帮助的。

标签: java spring spring-mvc


【解决方案1】:

这似乎是不正确的控制器/视图接线。我这么说是因为我在堆栈跟踪中没有看到对 BilingInfoController 的引用。至少应该有对该控制器的引用,以便 handleRequest/Internal 加载 formBackingObject。

【讨论】:

  • 我已经用包含控制器和视图映射的配置文件更新了我的问题,你能看看吗?
  • Stacktrace 正确 - 在控制器返回 ModelAndView 后调用 DispatcherServlet.render()
  • @axtavt - 那么出现这样的错误消息的可能原因是什么?
  • @Rachel:我不知道,但由于堆栈跟踪很好,我能想象的唯一可能原因是控制器的命令名称和 JSP 中的命令名称不匹配。我看到您有 2 个具有不同命令名称的控制器,您确定它们的 JSP 也具有不同的命令名称吗?
  • @axtavt:我在控制器和 jsp 中有相同的命令名,是的,他们的 jsp 有不同的命令名,但现在我只是想在不考虑公司页面的情况下让应用程序页面正常工作,并且收到此错误消息ap 页面本身,希望在这里让我自己有点清楚......通常应该调试序列来摆脱这种错误?
【解决方案2】:

当你的jsp被渲染时,错误本身就会发生。我假设你有一个可能带有类似标签的 jsp (spring:bind 会导致同样的问题)

<form:form modelAttribute="billingInfoCommand">
...
</form:form>

当它呈现 jsp 时,它会在您的请求范围内查找名为 billingInfoCommand 的 bean,并使其可用于 jstl 表达式(以及其他内容)。当请求范围内不存在对象时,将抛出您看到的异常。

编辑:

很高兴看到您在删除所有代码时没有收到任何错误。接下来,尝试直接查看请求范围。

<div>The request scope is: ${requestScope}</div>
<div>The command is: ${requestScope.billingInfoCommand}</div>

如果你看到类似

请求范围为:javax.servlet.jsp.el.ImplicitObjectELResolver......
命令是:

那么你的bean实际上不在请求范围内。接下来您需要查看的是支持对象在哪里被放入请求范围内。第一个想法是 formBackingObject 方法可能与将其放入请求中有关。

【讨论】:

  • 但在我的情况下,我在请求范围内有billingInfoCommand,所以我不确定为什么会出现这个错误,有什么线索吗?
  • 同样来自 jsp 我的电话是&lt;form:form commandName="billingInfoCommand" method="post" onsubmit="return checkVals()"&gt;
  • 我说要删除那个
    (注释掉),然后尝试加载页面。然后对该对象的引用将消失,并且可能会加载页面。然后,您将知道您的命令对象是否在显示视图之前在控制器中丢失(showForm(...))等。
  • @Matt:尝试注释掉 form tag,但仍然收到相同的 BindingResult 错误消息。
  • 两个问题,1.您所指的表单:表单是 billingInfo.jsp 中的,2.如果您删除所有 html(可能标题除外),问题是否仍然存在
【解决方案3】:

确保您在请求中设置绑定对象或显示对象,使用

这应该放在使用绑定对象之前或任何包含 jsp 标记之前 如下

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2016-11-24
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多