2012-12-18 54 views
1

這是一個長鏡頭...Spring.Objects.Factory.ObjectCreationException信息:System.ArgumentNullException:鍵不能爲空

我使用彈簧1.3.2,並在隨機時間,我得到ArgumentNullException異常(見堆棧以下跟蹤)。我正在XML和代碼之間混合配置容器(通過直接使用ObjectDefinitionBuilder,沒有代碼配置)。並行註冊(5個線程加載定義)。

我的所有對象都通過構造函數使用自動裝配,錯誤發生在構造函數中有或沒有項目的組件中。

我做一切都登記在容器

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) 

編輯: 我剛剛得到了所有的定義名稱並以某種方式存在有一個空項,這似乎是這個問題,不知道爲什麼它正在發生的事情還沒有...

回答

1

我唯一能解決的問題是改變內部objectDefinitionNames ArrayListArrayList.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)); 
相關問題