SpringおよびMybatis統合プレースホルダ解析失敗問題解決


問題:新しいdaoインターフェースを書いて、ユニットテストをする時にヒントを与えます。
Initialization of bean failed;neted exception is org.spring frame ebook.beans.Type MismatchException:Failed to convert property value of type'java.lang.String'to required type'int'for property maxActive;neted exception is java.lang.Number FormatException:For input string:「$maxActive」
元々はdatasourceを設定していますが、このヒントはプレースホルダ$maxActiveを解析しても対応する属性が見つかりません。
ユニットテストロードproperties@PropertySource(value={classipath*:jdbc.properties})を使ってプロファイルをロードします。
自分のpropertiesファイルの経路が正しく、属性値が存在することを確認した後、https://my.oschina.net/u/1455908/blog/215953によると、mybatisを配置するMapperScanner Contingurerの場合は@ProptySourceの注釈解析プレースホルダより優先され、プレースホルダが解析されていないため、直接に「$maxActive」を使用した。つまりエラーという「$maxActive」という文字列は対応するint値に変換できません。
問題を解決する
設定ファイルのロードをもとに注釈@PropertySource(value={classipath*:jdbc.properties}を使って以下のように変更します。

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
			</list>
		</property>
		<property name="ignoreUnresolvablePlaceholders" value="true"></property>
	</bean>
元々MapperScanner Configrerの配置は修正されていませんでしたが、次のようになります。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.**.dao,com.**.mapper,com.**.test.**.mapper" />
    <!--     name         sqlSessionFactoryBeanName  ,         ,         -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
このようにこの問題を解決します。しかし、疑問は依然として存在しています。なぜ@PropertySourceという注釈はイグノレUnirevable Placeholdersという属性が配置されておらず、xmlで正確に解析できます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。