2012-04-04 8 views
27

मैं वसंत 3 उपयोग कर रहा हूँ, और मैं दृश्य दायरे से दो सेम है:अनुरोधित बीन वर्तमान में सृजन में है: क्या कोई अनौपचारिक परिपत्र संदर्भ है?

1- Bean1:

@Component("bean1") 
@Scope("view") 
public class Bean1 { 

@Autowired 
private Bean2 bean2; 

} 

2- Bean2:

@Component("bean2") 
@Scope("view") 
public class Bean2 { 

@Autowired 
private Bean1 bean1; 

} 

दृश्य है एक कस्टम स्कोप:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> 
     <property name="scopes"> 
      <map> 
       <entry key="view"> 
        <bean class="${project.groupId}.utils.ViewScope" /> 
       </entry> 
      </map> 
     </property> 
    </bean> 

और यहाँ कस्टम दृश्य क्षेत्र के लिए कोड है:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'agencyBean': Requested bean is currently in creation: Is there an unresolvable circular reference? 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:252) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329) 
    at com.myapp.utils.ViewScope.get(ViewScope.java:20) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329) 
    at com.xeno.xecamp.webManagement.utils.ViewScope.get(ViewScope.java:20) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1075) 
    at org.springframework.beans.factory.access.el.SpringBeanELResolver.getValue(SpringBeanELResolver.java:56) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71) 
    at org.apache.el.parser.AstValue.getTarget(AstValue.java:94) 
    at org.apache.el.parser.AstValue.invoke(AstValue.java:244) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at com.sun.faces.facelets.tag.jsf.core.DeclarativeSystemEventListener.processEvent(EventHandler.java:128) 
    at javax.faces.component.UIComponent$ComponentSystemEventListenerAdapter.processEvent(UIComponent.java:2508) 
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106) 
    at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2139) 
    at com.sun.faces.application.ApplicationImpl.invokeComponentListenersFor(ApplicationImpl.java:2087) 
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:286) 
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:244) 
    at org.springframework.faces.webflow.Jsf2FlowApplication.publishEvent(Jsf2FlowApplication.java:94) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:108) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:99) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:60) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:119) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:57) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) 
    at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:110) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:119) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 

कृपया इस अपवाद को ठीक करने की सलाह दें:

public class ViewScope implements Scope { 

    @SuppressWarnings("rawtypes") 
    public Object get(String name, ObjectFactory objectFactory) { 
     Map<String, Object> viewMap = FacesContext.getCurrentInstance() 
       .getViewRoot().getViewMap(); 

     if (viewMap.containsKey(name)) { 
      return viewMap.get(name); 
     } else { 
      Object object = objectFactory.getObject(); 
      viewMap.put(name, object); 

      return object; 
     } 
    } 

    public Object remove(String name) { 
     return FacesContext.getCurrentInstance().getViewRoot().getViewMap() 
       .remove(name); 
    } 

    public String getConversationId() { 
     return null; 
    } 

    public void registerDestructionCallback(String name, Runnable callback) { 
     // Not supported 
    } 

    public Object resolveContextualObject(String key) { 
     return null; 
    } 
} 

जब पेज दोनों सेम का उपयोग करता है खोलने, मैं अपवाद मिलता है।

संपादित: मैं के रूप में यहाँ

Understanding Spring context initialization order

जवाब में संदर्भित सेटर इंजेक्शन उपयोग करने के लिए कोशिश की, लेकिन ऐसा नहीं भी काम करते हैं।

1- Bean1:

@Component("bean1") 
@Scope("view") 
public class Bean1 { 


private Bean2 bean2; 

@Autowired 
public void setBean2 (Bean2 bean2) { 
    this.bean2= bean2; 
} 

} 

2- Bean2:

@Component("bean2") 
@Scope("view") 
public class Bean2 { 


private Bean1 bean1; 

@Autowired 
public void setBean1 (Bean1 bean1) { 
    this.bean1= bean1; 
} 

} 

लेकिन यह मुझे अपवाद देता है:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.myapp.beans.Bean1] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
+2

सर्कुलर निर्भरता के साथ समस्या को हल करने के लिए आपको एक ऑटोवायर निर्भरता को हटा देना चाहिए और इसे बाद में मैन्युअल रूप से सेट करना चाहिए (@PostConstruct या कुछ इसी तरह के साथ)। नीचे 'sinuhepop' उदाहरण देखें। –

+0

यह आलेख मदद करता है कि कौन उत्तर ढूंढ रहा है। http://www.baeldung.com/circular- निर्भरता-in-pring – bpedroso

उत्तर

45

वसंत सिंगलटन बीन्स के साथ इस प्रकार की परिपत्र निर्भरताओं को हल करने के लिए एक विशेष तर्क का उपयोग करता है। लेकिन यह अन्य क्षेत्रों में लागू नहीं होगा। इस सर्कुलर निर्भरता को तोड़ने का कोई सुरुचिपूर्ण तरीका नहीं है, लेकिन एक अनाड़ी विकल्प यह एक हो सकता है:

@Component("bean1") 
@Scope("view") 
public class Bean1 { 

    @Autowired 
    private Bean2 bean2; 

    @PostConstruct 
    public void init() { 
     bean2.setBean1(this); 
    } 
} 

@Component("bean2") 
@Scope("view") 
public class Bean2 { 

    private Bean1 bean1; 

    public void setBean1(Bean1 bean1) { 
     this.bean1 = bean1; 
    } 
} 

वैसे भी, परिपत्र निर्भरता आमतौर पर बुरा डिजाइन का एक लक्षण है। यदि आपकी कक्षा निर्भरताओं को परिभाषित करने का कोई बेहतर तरीका है तो आप फिर से सोचेंगे।

+8

सहमत, डीआई या नहीं, परिपत्र निर्भरता बनाए रखने के लिए एक दर्द है और इससे बचा जाना चाहिए। –

+4

कुछ ऐसे मामले हैं जहां परिपत्र निर्भरताएं पूर्ण समझ में आती हैं। कोको में प्रतिनिधि पैटर्न की तरह। एक व्यू कंट्रोलर एक दृश्य के लिए प्रतिनिधि के रूप में कार्य करता है। –

1

सामान्य में, जिस तरह से करने के लिए सर्कुलर निर्भरताओं के साथ सौदा एस का उपयोग करना है ईटर इंजेक्शन।

मैंने आपके द्वारा पोस्ट किए गए सेटर इंजेक्शन कोड की कोशिश की, और यह मेरे लिए काम किया। मैं कल्पना करता हूं कि आपको अपवाद मिल रहा है क्योंकि बीन 1 और बीन 2 com.myapp.beans पैकेज में हैं, और आपके पास उस पैकेज के लिए घटक स्कैनिंग सक्षम नहीं है। एक पैकेज जो स्वचालित रूप से वसंत द्वारा स्कैन किया जा रहा है के लिए सेम ले जाने

<context:component-scan base-package="com.bullethq.accounts.web"/> 

या:

आप अपने वसंत विन्यास के लिए निम्न जोड़ने की जरूरत होगी।

+1

मेसालेह दोनों मामलों में सेटर इंजेक्शन का उपयोग कर रहा है (कन्स्ट्रक्टर तर्क इंजेक्शन के विपरीत)। आपका परीक्षण शायद काम करता था क्योंकि आपने सिंगलटन स्कोप्ड बीन्स का इस्तेमाल किया था। – sinuhepop

2

मैं काफी बेवकूफ तरीके से इस त्रुटि का सामना

@Autowired 
// private Bean bean; 

public void myMethod() { 
    return; 
} 

क्या हुआ कि मैं किसी कारण के लिए एक लाइन टिप्पणी की है और एनोटेशन जो बना वसंत लगता है कि विधि

18

autowired किए जाने की आवश्यकता छोड़ दिया है मैं तुम्हें वसंत के

@Lazy

इस्तेमाल कर सकते हैं लगता है

गोलाकार निर्भरता तोड़ने के लिए स्वचालित वाहनों में से एक पर एनोटेशन।

मुझे यकीन नहीं है कि यह निर्दिष्ट स्प्रिंग संस्करण में काम करता है/मौजूद है।

+2

यह मेरे लिए तय है। धन्यवाद! – codematix

+0

मेरे लिए यह अपवाद के लिए बीन असाइन करता है और जारी है! –

संबंधित मुद्दे