java - Spring Webflow IllegalStateException : Neither BindingResult nor plain target object for bean name available as request attribute

标签 java forms spring jsp spring-webflow-2

我的最终目标是拥有一个带有注释的模型并对表单输入进行验证。我尝试过编写一些 validator ,但它不起作用(表单甚至不会显示我可以输入 sp 的字段,没有任何东西可以测试验证),所以我从一开始就分步尝试。作为第一步,我只想在开始任何类型的验证之前使模型绑定(bind)工作。

作为一个简单的尝试,我使用了 mailItemModel 表单 http://www.javabeat.net/introduction-to-spring-web-flow-swf/

我已将以下行添加到 servlet-config.xml,该文件链接在 web.xml 中:

<mvc:annotation-driven />   
<context:annotation-config />
<context:component-scan base-package="com.mypackage.kumo.**" /> 

我从另一个教程中得到了这一点,我认为这将扫描整个包,并且我不需要显式指定变量中的所有模型。我得到标题错误。 我还尝试将“@Component”添加到模型类中。但这并没有改变任何事情。

然后我尝试添加到流 XML 中

<var name="MailItemModel" />

如上面链接的教程所示。我收到错误,该元素 var"需要一个 "class"属性。所以我改为这样:

<var name="MailItemModel" class="com.mypackage.kumo.model.MailItemModel" />

但这只会引发与以前完全相同的错误。

我的流程现在看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=" 
        http://www.springframework.org/schema/webflow 
        http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
    start-state="Start">

    <var name="MailItemModel" class="com.mypackage.kumo.model.MailItemModel" />

    <view-state id="Start" view="/Search" model="MailItemModel">
        <transition on="entered" to="temp" />
        <transition on="cancel" to="SubEnde" />
    </view-state>

    <view-state id="temp" view="/End" />

    <view-state id="SubEnde" view="/Start" />    
</flow>

Search.jsp(表单摘录)

<form:form method = "post" modelAttribute = "mailItemModel">
      Mail Username: <form:input path="username" />
         <br />
       <input type="submit" name="_eventId_entered" value="Entered" />
       <input type="submit" name="_eventId_cancel" value="Cancel" />
</form:form>

Start.jsp 和 End.jsp 只是带有一些 lorem ipsum 内容的静态 jsp。

堆栈跟踪:

root cause

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'mailItemModel' available as request attribute
    org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:141)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:132)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:116)
    org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
    org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142)
    org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
    org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
    org.apache.jsp.WEB_002dINF.jsp.Search_jsp._jspx_meth_form_005finput_005f0(Search_jsp.java:559)
    org.apache.jsp.WEB_002dINF.jsp.Search_jsp._jspx_meth_form_005fform_005f0(Search_jsp.java:522)
    org.apache.jsp.WEB_002dINF.jsp.Search_jsp._jspx_meth_dsx_005fcontent_002dbox_005f0(Search_jsp.java:478)
    org.apache.jsp.WEB_002dINF.jsp.Search_jsp._jspx_meth_dsx_005fcontent_005f0(Search_jsp.java:439)
    org.apache.jsp.WEB_002dINF.jsp.Search_jsp._jspx_meth_dsx_005fhtml_002dbody_005f0(Search_jsp.java:375)
    org.apache.jsp.WEB_002dINF.jsp.Search_jsp._jspx_meth_dsx_005fhtml_005f0(Search_jsp.java:293)
    org.apache.jsp.WEB_002dINF.jsp.Search_jsp._jspService(Search_jsp.java:126)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    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:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
    org.springframework.webflow.mvc.servlet.ServletMvcView.doRender(ServletMvcView.java:55)
    org.springframework.webflow.mvc.view.AbstractMvcView.render(AbstractMvcView.java:187)
    org.springframework.webflow.engine.ViewState.render(ViewState.java:296)
    org.springframework.webflow.engine.ViewState.refresh(ViewState.java:243)
    org.springframework.webflow.engine.ViewState.resume(ViewState.java:221)
    org.springframework.webflow.engine.Flow.resume(Flow.java:545)
    org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:258)
    org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169)
    org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)
    org.springframework.webflow.mvc.servlet.FlowController.handleRequest(FlowController.java:174)
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我做错了什么?我已经研究了相同错误的其他帖子,但它们都使用 @requestmapping 到 Controller 中的 URL,但由于我使用的是 Webflow,所以我不(并且看起来不能)使用 Controller ,所以它没有并没有太大帮助。

最佳答案

您的配置中有两处缺陷

  1. 您的型号名称错误
  2. 你的基础包是一个 Ant 风格的表达式

在您的配置中,您将模型对象命名为 MailItemModel (注意M)

<var name="MailItemModel" class="com.mypackage.kumo.model.MailItemModel" />

在你看来它的名字是mailItemModel (注意m)。

<form:form method = "post" modelAttribute = "mailItemModel">

在流配置中将其更改为 mailItemModel或者在您看来使用 MailItemModel名称必须匹配,包括大小写。

关于您的配置。

<context:component-scan base-package="com.mypackage.kumo.**" /> 

base-package属性只是要扫描的基本包的名称。它不需要 Ant 式的表达。删除结尾 .** .

<context:component-scan base-package="com.mypackage.kumo" /> 

最后注意 <context:component-scan … /> 的使用已经暗示<context:annotation-config />这样您就可以删除该配置行。

关于java - Spring Webflow IllegalStateException : Neither BindingResult nor plain target object for bean name available as request attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23731252/

相关文章:

java - org.springframework.jms.IllegalStateException : The Session is closed

java - 访问同一类中声明的对象的变量

java - 使用 for 循环和 charAt();以交替大小写的方式打印字符串中的字母

java - 使用 == 检查对象引用相等性(在 Java 中)

javascript - 提交父 html 表单而不是子弹出表单?

c# - 对象不是函数错误

spring - 如何使用 Spring Integration 仅在事务成功完成时发送消息?

java - 如何使用 java 和 oauth 2.0 在 Azure AD 中注册应用程序来阅读我的 Outlook 邮件

forms - VB6 .frm 文件格式属性无故更改!

java - Spring Data JPA - 多个持久性单元作为 JUnit 工作,但不在 Tomcat 中