2012-12-18 11 views
1

이 긴 샷 ...Spring.Objects.Factory.ObjectCreationException : System.ArgumentNullException :

나는 봄 1.3.2를 사용하고 있는데 임의의 시간에 나는 경우 ArgumentNullException 예외를 얻을 (스택을 참조 키는 null 일 수 없습니다 추적).

XML과 코드의 혼합으로 컨테이너를 구성합니다 (ObjectDefinitionBuilder를 직접 사용하고 코드를 구성하지 않음). 등록은 병렬로 수행됩니다 (5 개의 스레드 로딩 정의).

내 모든 개체가 생성자를 통해 Autowiring을 사용하면 생성자에 항목이있는 두 구성 요소 모두에서 오류가 발생합니다.

내가 모든 것이 스택 추적에서 컨테이너

context.GetObjectsOfType(typeof (IFoo)).OfType<DictionaryEntry>().Select(d => (IFoo) d.Value) 

에 등록하고 코드를 찾고 있었어요 후 다음 호출을하고있어, 나는 IsAlias에 대한 호출이 실패한 것 같다 볼 수 있지만, 어떻게 이런 일이 일어날 지 모르겠다.

모든 아이디어/아이디어?

스택 추적 :

Spring.Objects.Factory.ObjectCreationException: Error creating object with name 'My.App.SomeFooImplementation' : Initialization of object failed : Key cannot be null. 
Parameter name: key ---> System.ArgumentNullException: Key cannot be null. 
Parameter name: key 
    at System.Collections.Hashtable.ContainsKey(Object key) 
    at System.Collections.Specialized.OrderedDictionary.Contains(Object key) 
    at Spring.Objects.Factory.Support.AbstractObjectFactory.IsAlias(String name) 
    at Spring.Objects.Factory.Support.DefaultListableObjectFactory.DoGetObjectNamesForType(Type type, Boolean includeNonSingletons, Boolean allowEagerInit) 
    at Spring.Objects.Factory.Support.DefaultListableObjectFactory.GetObjectNamesForType(Type type, Boolean includePrototypes, Boolean includeFactoryObjects) 
    at Spring.Objects.Factory.ObjectFactoryUtils.ObjectNamesForTypeIncludingAncestors(IListableObjectFactory factory, Type type, Boolean includePrototypes, Boolean includeFactoryObjects) 
    at Spring.Objects.Factory.Support.DefaultListableObjectFactory.FindAutowireCandidates(String objectName, Type requiredType, DependencyDescriptor descriptor) 
    at Spring.Objects.Factory.Support.DefaultListableObjectFactory.ResolveDependency(DependencyDescriptor descriptor, String objectName, IList autowiredObjectNames) 
    at Spring.Objects.Factory.Support.ConstructorResolver.CreateArgumentArray(String objectName, RootObjectDefinition rod, ConstructorArgumentValues resolvedValues, ObjectWrapper wrapper, Type[] paramTypes, MethodBase methodOrCtorInfo, Boolean autowiring, UnsatisfiedDependencyExceptionData& unsatisfiedDependencyExceptionData) 
    at Spring.Objects.Factory.Support.ConstructorResolver.AutowireConstructor(String objectName, RootObjectDefinition rod, ConstructorInfo[] chosenCtors, Object[] explicitArgs) 
    at Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateObjectInstance(String objectName, RootObjectDefinition objectDefinition, Object[] arguments) 
    at Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.InstantiateObject(String name, RootObjectDefinition definition, Object[] arguments, Boolean allowEagerCaching, Boolean suppressConfigure) 
    --- End of inner exception stack trace --- 
    at Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.InstantiateObject(String name, RootObjectDefinition definition, Object[] arguments, Boolean allowEagerCaching, Boolean suppressConfigure) 
    at Spring.Objects.Factory.Support.AbstractObjectFactory.CreateAndCacheSingletonInstance(String objectName, RootObjectDefinition objectDefinition, Object[] arguments) 
    at Spring.Objects.Factory.Support.AbstractObjectFactory.GetObjectInternal(String name, Type requiredType, Object[] arguments, Boolean suppressConfigure) 
    at Spring.Objects.Factory.Support.AbstractObjectFactory.GetObject(String name) 

편집 : 난 그냥 모든 정의 이름을 가지고 어떻게 든 확실하지 왜 아직 무슨 일이 일어나고 문제가 될 것으로 보인다 거기에 null 항목이,이 ...

답변

1

유일한 픽스는 내부 objectDefinitionNames ArrayList을 바꿔서 ArrayList.Synchronized으로 바꿔야한다는 것입니다. 전혀 좋지 않다.하지만 일을하는 것처럼 보입니다.

 var field = factory.GetType().GetField("objectDefinitionNames", BindingFlags.NonPublic | BindingFlags.Instance); 
     if (field == null) 
      throw new InvalidOperationException("Could not get Definitions field from application context."); 

     var value = (ArrayList) field.GetValue(factory); 
     field.SetValue(factory, ArrayList.Synchronized(value));