2014-11-14 4 views
1

UPDATE: С некоторой дальнейшей отладки, теперь я вижу, что, когда AbstractBeanFactory.doGetBean() называется "thread" существует в parentBeanFactory.scopes, но не в областях для этого боба завода (предположительно, WebApplicationContext).Spring SimpleThreadScope зарегистрирован, но не нашел, когда AbstractBeanFactory.doGetBean() называется

У меня довольно простой Spring MVC webapp, который очень похож на приложение spring-petclinic. Я пытаюсь использовать SimpleThreadScope (да, я знаю о предостережениях, и я не хочу использовать область запроса), но он не работает должным образом.

Во-первых, я попробовал использовать компонент, связанный с потоком, который мой контроллер будет использовать. Но я обнаружил, что разные потоки всегда используют один и тот же экземпляр этого компонента. Поэтому я попробовал объявить мой контроллер как область с областью, используя аннотацию @Scope(value="thread").

Используя отладчик Eclipse/STS, я вижу, что мой CustomScopeConfigurer работает правильно и регистрирует SimpleThreadScope под ключом "thread". Но в дальнейшем при обслуживании веб-запроса, создается исключение с указанием Область действия не зарегистрирован для сферы «нити»:

SEVERE: Servlet.service() for servlet audit threw exception 
java.lang.IllegalStateException: No Scope registered for scope 'thread' 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:271) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1021) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:964) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:862) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:494) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:298) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1186) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:341) 
at org.springframework.context.support.SimpleThreadScope.get(SimpleThreadScope.java:67) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:336) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975) 
at org.springframework.web.method.HandlerMethod.createWithResolvedBean(HandlerMethod.java:219) 
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:257) 
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:57) 
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:299) 
at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1098) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:910) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:724) 

ответ

0

После чуть более отладки я обнаружил, что, когда AbstractBeanFactory.doGetBean() называется "thread" существует в parentBeanFactory.scopes, но не в области для этой фабрики фасоли (предположительно, WebApplicationContext).

Таким образом, решение состоит в том, чтобы настроить CustomScopeConfigurer как для WebApplicationContext, так и для его родительского контекста. например как в конфигурации контекста приложения DispatcherServlet, так и в контексте, заданном ContextLoaderListener. Это обеспечит регистрацию области для обеих фасонных фабрик.