Ошибка создания bean-компонента с именем: область «запрос» не активна для текущего потока.

Я интегрировал SWF 2.2.1, Primefaces 2.2.1, JSF 2, Spring Security 3, Spring 3.1.0M1I, EhCache, AspectJ и Castor.

Я определил бобы для castor в моем app-config.xml, например

<bean id="oXMapper" class="com.abc.xyz.util.OXMapper">
    <property name="unmarshaller" ref="unmarshaller" />
    <property name="marshaller" ref="marshaller" />
    <property name="acordRequest" ref="acordRequest" />
    <property name="acordResponse" ref="acordResponse" />
</bean>

<bean id="unmarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
    <property name="mappingLocation"
        value="classpath:/templates/mapping/ACORD_Response_Mapping.xml" />
</bean>

<bean id="marshaller" class="org.springframework.oxm.castor.CastorMarshaller">
    <property name="mappingLocation"
        value="classpath:/templates/mapping/ACORD_Request_Mapping.xml" />
</bean>

<bean id="acordRequest" class="com.abc.xyz.cate.domain.ACORD">
    <property name="insuranceSvcRq" ref="insuranceSvcRq" />
    <property name="signonRq" ref="CltSearch_signonRq" />
</bean>

У меня есть страница поиска, на которой я создаю такие параметры, как

<h:panelGrid>
    <h:selectOneRadio id="#{msg.srchType}" value="#{acordRequest.insuranceSvcRq.com_csc_ClientSearchRq.com_csc_SearchInfo.com_csc_SearchCriteria.com_csc_ClientSearch.com_csc_SearchNameByType}">
        <f:selectItem itemLabel="#{msg.exact}" itemValue="E" id="#{msg.exact}" />
    <f:selectItem itemLabel="#{msg.phonetic}" itemValue="S" id="#{msg.phonetic}" />
    <f:selectItem itemLabel="#{msg.truncated}" itemValue="P" id="#{msg.truncated}" />
        </h:selectOneRadio>
</h:panelGrid>

Используя Spring Webflow, я вызываю функции OXMapper и передаю им объект ACORD (иерархическая структура, используемая для построения xml). Этот класс OXMapper отвечает за маршалинг и демаршаллинг объекта и xml соответственно.

Теперь проблема заключается в том, что всякий раз, когда я снова ищу на странице поиска, старые значения автоматически заполняются внутри полей.

Поэтому я попытался изменить область действия на "Запрос".

<bean id="acordRequest" class="com.abc.xyz.cate.domain.ACORD"
    scope="request">
    <property name="insuranceSvcRq" ref="insuranceSvcRq" />
    <property name="signonRq" ref="CltSearch_signonRq" />
</bean>

После изменения области я получаю следующую ошибку:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'oXMapper' defined in ServletContext resource [/WEB-INF/config/app-config.xml]: Cannot resolve reference to bean 'acordRequest' while setting bean property 'acordRequest'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acordRequest': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

Мой web.xml выглядит следующим образом

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/config/web-application-config.xml
    </param-value>
</context-param>
<error-page>
    <error-code>500</error-code>
    <location>/error.xhtml</location>
</error-page>
<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>1</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/springsecurity.taglib.xml</param-value>
</context-param>
<!-- Enables Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/certs/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

My faces-config.xml has nothing as such

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">

<application>
    <!-- <message-bundle>JsfMessageResources</message-bundle> -->
</application>
<!-- JSF 2.0 Version of this faces-config.xml file -->


person C4CodeE4Exe    schedule 24.06.2011    source источник


Ответы (1)


Если вы не используете Spring MVC, чтобы использовать область request, вы должны сослаться на RequestContextListener в своем файле web.xml:

Если вы используете веб-контейнер Servlet 2.4+, а запросы обрабатываются вне Spring DispatcherServlet (например, при использовании JSF или Struts), вам необходимо добавить следующий javax.servlet.ServletRequestListener в объявления в файле веб-приложений web.xml :

<web-app>
...
<listener>
  <listener-class>
      org.springframework.web.context.request.RequestContextListener
  </listener-class>
</listener>
...
</web-app>

Цитата из документы.

person abalogh    schedule 24.06.2011
comment
спасибо abalogh за ответ. Я забыл упомянуть, что даже пытался включить RequestContextListener в web.xml, как вы упомянули. Тем не менее я получаю ту же ошибку. :-( - person C4CodeE4Exe; 24.06.2011
comment
Не могли бы вы опубликовать свой файл web.xml и Faces-config.xml? Также попробуйте обновиться до Spring 3.1M2, маловероятно, что это решит вашу проблему, но зачем использовать устаревшую веху, когда есть более новая? - person abalogh; 24.06.2011
comment
Я использую только обновленную версию Spring 3.1M2. Я разместил рекламу web.xml на странице-config.xml. Спасибо - person C4CodeE4Exe; 24.06.2011
comment
Каков адрес вашей страницы поиска? - person abalogh; 24.06.2011
comment
Вы хотите увидеть страницу, потому что приложение находится в какой-то сети. Вы не сможете получить к ней доступ. Мне нужно развернуть его на моей локальной машине. В любом случае я это сделаю. - person C4CodeE4Exe; 24.06.2011
comment
нет, я имел в виду, по какому URL-адресу в вашем контексте он доступен. например servercontext/certs/search.faces - person abalogh; 25.06.2011
comment
@abalogh - Не могли бы вы помочь мне в этом? URL-адрес, когда я впервые нажал его в IE - localhost: 8080/certificates_presentation/certs/… . После входа в систему он изменился на localhost: 8080/certificates_presentation/certs/… . Я не могу сбросить значения сеанса, поэтому мне нужна эта область запроса. Не могли бы вы указать, есть ли какой-то другой способ. - person C4CodeE4Exe; 28.06.2011