我的最终目标是拥有一个带有注释的模型并对表单输入进行验证。我尝试过编写一些 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 ,所以它没有并没有太大帮助。
最佳答案
您的配置中有两处缺陷
- 您的型号名称错误
- 你的基础包是一个 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/