Spring Webflow IllegalStateException: ни BindingResult, ни простой целевой объект для имени компонента не доступны в качестве атрибута запроса

Моя конечная цель - иметь модель с аннотациями и выполнять проверки ввода формы. Я пробовал это с написанием некоторых валидаторов, но это не сработало (форма даже не показывала поля, в которые я мог ввести sp, не было ничего для проверки проверки), поэтому я пробовал это с самого начала небольшими шагами. В качестве первого шага я просто хочу, чтобы привязка модели работала, прежде чем я начну какую-либо проверку.

В качестве простой попытки я использовал форму 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" требует атрибута "класс". Поэтому вместо этого я делаю это:

<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 — это просто статические jsps с некоторым содержимым lorem ipsum.

Трассировка стека:

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 для URL-адреса в контроллере, но, поскольку я использую Webflow, я не (и, похоже, не могу) использовать контроллеры, поэтому он не не очень помогает.


person kumoyadori    schedule 19.05.2014    source источник


Ответы (1)


В вашей конфигурации есть 2 ошибки

  1. Ваше имя модели неверно
  2. Ваш базовый пакет представляет собой выражение в стиле муравья.

В вашей конфигурации вы назвали свой объект модели 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 — это просто имена базовых пакетов для сканирования. Это не требует выражения в стиле муравья. Удалите окончание .**.

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

Последнее замечание: использование <context:component-scan … /> уже подразумевает <context:annotation-config />, поэтому вы можете удалить эту строку конфигурации.

person M. Deinum    schedule 19.05.2014
comment
Спасибо, исправление проблемы M-m решило проблему. Через мне все еще нужно объявить переменную с полным путем к классам. Так происходит ли автоматическое сканирование компонентов только для аннотаций? Это означает, что в случае, если путь к классам может когда-либо измениться, мне придется вручную изменить каждый файл xml потока, который использует модель? - person kumoyadori; 19.05.2014
comment
Для сканирования компонентов см. Справочное руководство Spring. Что касается вашей модели, если вам нужны модели с потоком, вам придется объявить их в своем потоке. - person M. Deinum; 19.05.2014