1

プロジェクトを .NET 3.5 から .NET 4 に変換しようとすると、Spring.net で最も奇妙な問題が発生します。

私たちのアーキテクチャを要約してみましょう: プロジェクト A (私の管理下にない) には、次のような設定 (configurationProvider.url) を参照する Sprint.Net 構成があります。

<constructor-arg name="Url" value="${configurationProvider.url}" />

プロジェクト B (私の管理下にある私のプロジェクト) には、この設定の値を持つ別の構成ファイルがあります。

<configuration>
  <Environment>
    <add key="Dashboard.Environment"      value="UAT" />
    <add key="configurationProvider.url"  value="http://something/ConfigurationProvider.asmx"/>
    <add key="pkicheck.url"               value="http://something/webservices/pkicheck.asmx"/>
    <add key="sso.url"                    value="http://something/webservices/ssoclient.asmx"/>
  </Environment>
</configuration>

プロジェクト B が .NET 3.5 の場合、すべてうまく機能します。このプロジェクトを .NET 4 に変換すると (それが唯一の変更点です)、すべてが失敗し始め、次の例外が発生します。

Could not resolve placeholder 'configurationProvider.url'

このファイルはそこにあり、値が含まれていますが、明らかに ProjectB 構成ファイルの構成設定が見つかりません。3.5 と 4 の間で何が変わったのでしょうか?

完全な例外:

<ConfigurationErrorsException d1p1:type="ConfigurationErrorsException">
 <ClassName>System.Configuration.ConfigurationErrorsException</ClassName>
 <Message>Error creating context 'spring.root': Error registering object with name 'configurationProvider' defined in 'assembly [ProjectA.Core, Version=0.0.0.88, Culture=neutral, PublicKeyToken=1b28b51fb20f454e], resource [ProjectA.Core.Framework.config] line 111' : Could not resolve placeholder 'configurationProvider.url'.</Message>
 <Data d1p1:type="IDictionary"/>
<InnerException d1p1:type="Exception">
 <ClassName>Spring.Objects.Factory.ObjectDefinitionStoreException</ClassName>
 <Message>Error registering object with name 'configurationProvider' defined in 'assembly [ProjectA.Core, Version=0.0.0.88, Culture=neutral, PublicKeyToken=1b28b51fb20f454e], resource [ProjectA.Core.Framework.config] line 111' : Could not resolve placeholder 'configurationProvider.url'.</Message>
 <Data d1p1:type="IDictionary"/>
 <InnerException d1p1:type="Exception"/>
 <HelpURL/>
 <StackTraceString> at Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer.ProcessProperties(IConfigurableListableObjectFactory factory, NameValueCollection props) at Spring.Objects.Factory.Config.PropertyResourceConfigurer.PostProcessObjectFactory(IConfigurableListableObjectFactory factory) at Spring.Context.Support.AbstractApplicationContext.ProcessObjectFactoryPostProcessors(IList objectFactoryPostProcessors) at Spring.Context.Support.AbstractApplicationContext.InvokeObjectFactoryPostProcessors() at Spring.Context.Support.AbstractApplicationContext.Refresh() at Spring.Context.Support.XmlApplicationContext..ctor(Boolean refresh, String name, Boolean caseSensitive, IApplicationContext parentContext, String[] configurationLocations) at Spring.Context.Support.XmlApplicationContext..ctor(String name, Boolean caseSensitive, String[] configurationLocations) at _dynamic_Spring.Context.Support.XmlApplicationContext..ctor(Object[] ) at Spring.Reflection.Dynamic.SafeConstructor.Invoke(Object[] arguments) at Spring.Context.Support.ContextHandler.RootContextInstantiator.InvokeContextConstructor(ConstructorInfo ctor) at Spring.Context.Support.ContextHandler.ContextInstantiator.InstantiateContext() at Spring.Context.Support.ContextHandler.InstantiateContext(IApplicationContext parentContext, Object configContext, String contextName, Type contextType, Boolean caseSensitive, String[] resources) at Spring.Context.Support.ContextHandler.Create(Object parent, Object configContext, XmlNode section)</StackTraceString>
 <RemoteStackTraceString/>
 <RemoteStackIndex>0</RemoteStackIndex>
 <ExceptionMethod>8 ProcessProperties Spring.Core, Version=1.3.0.20349, Culture=neutral, PublicKeyToken=65e474d141e25e07 Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer Void ProcessProperties(Spring.Objects.Factory.Config.IConfigurableListableObjectFactory, System.Collections.Specialized.NameValueCollection)</ExceptionMethod>
 <HResult>-2146232832</HResult>
 <Source>Spring.Core</Source>
 <WatsonBuckets d1p1:type="System.Byte"d1p1:includeArrayAttribute="true"/>
 <_resourceDescription>assembly [ProjectA.Core, Version=0.0.0.88, Culture=neutral, PublicKeyToken=1b28b51fb20f454e], resource [ProjectA.Core.Framework.config] line 111</_resourceDescription>
 <_objectName>configurationProvider</_objectName>
 </InnerException>
 <HelpURL/>
 <StackTraceString> at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult) at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSection(String configKey) at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName) at System.Configuration.ConfigurationManager.GetSection(String sectionName) at Spring.Util.ConfigurationUtils.GetSection(String sectionName) at Spring.Context.Support.ContextRegistry.InitializeContextIfNeeded() at Spring.Context.Support.ContextRegistry.GetContext() at ProjectA.Core.Controller.Initialise(String flavour) in d:\TeamCity8100\buildAgent\work\850180d7b576030f\Code\Src\ProjectA\Framework\Core\Controller.cs:line 238</StackTraceString>
 <RemoteStackTraceString/>
 <RemoteStackIndex>0</RemoteStackIndex>
 <ExceptionMethod>8 EvaluateOne System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Configuration.BaseConfigurationRecord System.Object EvaluateOne(System.String[], System.Configuration.SectionInput, Boolean, System.Configuration.FactoryRecord, System.Configuration.SectionRecord, System.Object)</ExceptionMethod>
 <HResult>-2146232062</HResult>
 <Source>System.Configuration</Source>
 <WatsonBuckets d1p1:type="System.Byte"d1p1:includeArrayAttribute="true"/>
 <filename d1p1:type="Object"/>
 <line>0</line>
 <firstFilename d1p1:type="Object"/>
 <firstLine>0</firstLine>
 <count>0</count>
 </ConfigurationErrorsException>
4

1 に答える 1

1

私は最終的に問題を見つけました。設定で PropertyPlaceholderConfigurer を使用し、「Order」プロパティを設定しません。そのため、Spring は Order で「順序付け」していましたが、Order は常に int.Max と等しいため、順序出力は非決定論的でした。

構成ファイルに Order を追加すると修正されました。

于 2013-03-11T17:04:08.117 に答える