Spring+mybatis+maven統合プロセスjdbc.propertiesをロードします。
統合プロセスにおいてファイルのいくつかの参照経路を設定するには、主な場所が必要です。
spring-mybatis.xml中
jdbcプロファイルをロード中に次のようなエラーが発生しました。
これは、springでorg.mybatis.spring.mapper.MapperScanner Configrerを使って自動スキャンを行ったときに、sql Session Factoryを設定したら、PropertyPlace holderConfigurが失効する可能性があります。つまり、$jdbc.usernameを使って、このような表現を入手することができないからです。MapperScanner Configrerは実際に解析ローバーの定義段階であり、この時にsql Session Factoryを設定すると、いくつかのクラスを初期化してしまうことになります。この時、PropertyPlace holderConfigrerはまだ定義中の変数を置き換えることができず、表現式を文字列としてコピーしてしまいます。ただし、sql Session Factory属性を設定しないと、session Factoryのspringでの名前が必ずsql Session Factoryでないと自動的に注入できません。Mapper FactoryBeanを直接定義したり、自動代理インターフェース方式を放棄したりします。テストを経てsql Session Factoryを除去し、変更しました。
springのproperties解析
一般的にPropertyPlace HolderConfigrerを使用してプレースホルダを置換します。例えば、
その本質はProptyPlaceholderConfigrer(3.1前)またはProptySources PlaceholderConfigrer(3.1後)を登録したことである。
注意:PropertyPlace HolderConfigrerに内蔵されている機能は非常に豊富であり、もしそれが$xxxで定義されているxxxキーを見つけられなかったら、JVMシステムの属性(System.get Property()と環境変数(System.getetetectv)の中で探すことができます。system PropertiesModeとsearch System Evironment属性を有効にすることで、開発者はこの行動をコントロールすることができます。PropertySources PlaceholderConfigrerはこの基礎の上でEnmentとPropertySourceと協力するのがもっと良いです。また、PropertyPlaceholderBeanDefinitionParsserの親類の中でShuldGenerate Idはtrueに戻ります。つまり、デフォルトではbeanごとに一意の名前が生成されます。2つのProptySources Placeholder Configrerを使用した場合、本質はBenFactoryPostProcessorsorであり、springを実施する時にこのbeanがOrderedを実現したと発見されたら、順次実行される;デフォルトの無秩序; 3、このときたとえば この時、まずorder='1'をスキャンします。もしorder='2'をスキャンしなかったら 4、デフォルトの状況ではignore-unreolvable;見つかっていない場合は異常を投げますか?デフォルトのfalse:例外を投げる;
spring-mybatis.xml中
<!-- -->
最初は絶対パスを書いていましたが、間違いを見つけました。このように書いたら、claspathはsrc/main/resourceです。
と同じです。classipathはsrc/main/javaです。jdbcプロファイルをロード中に次のようなエラーが発生しました。
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122)
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:105)
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:74)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:312)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0' defined in class path resource [spring-mybatis.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [spring-mybatis.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [spring-mybatis.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'initialSize'; nested exception is java.lang.NumberFormatException: For input string: "${initialSize}"
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1387)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1128)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:438)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:624)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:120)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
... 25 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [spring-mybatis.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [spring-mybatis.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'initialSize'; nested exception is java.lang.NumberFormatException: For input string: "${initialSize}"
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1387)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1128)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
... 43 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [spring-mybatis.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'initialSize'; nested exception is java.lang.NumberFormatException: For input string: "${initialSize}"
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
... 53 more
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'initialSize'; nested exception is java.lang.NumberFormatException: For input string: "${initialSize}"
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:468)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:494)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:488)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1433)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1392)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1128)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
... 59 more
Caused by: java.lang.NumberFormatException: For input string: "${initialSize}"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:481)
at java.lang.Integer.valueOf(Integer.java:582)
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:155)
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115)
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:452)
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:424)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:181)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:448)
... 65 more
エラーの場所は以下の設定ファイルに対応しています。
設定ファイルに書き込みが完了したらエラーが発生しません。プロファイルがロードされていないためです。これは、springでorg.mybatis.spring.mapper.MapperScanner Configrerを使って自動スキャンを行ったときに、sql Session Factoryを設定したら、PropertyPlace holderConfigurが失効する可能性があります。つまり、$jdbc.usernameを使って、このような表現を入手することができないからです。MapperScanner Configrerは実際に解析ローバーの定義段階であり、この時にsql Session Factoryを設定すると、いくつかのクラスを初期化してしまうことになります。この時、PropertyPlace holderConfigrerはまだ定義中の変数を置き換えることができず、表現式を文字列としてコピーしてしまいます。ただし、sql Session Factory属性を設定しないと、session Factoryのspringでの名前が必ずsql Session Factoryでないと自動的に注入できません。Mapper FactoryBeanを直接定義したり、自動代理インターフェース方式を放棄したりします。テストを経てsql Session Factoryを除去し、変更しました。
より良い解決方法は以下の通りです。
sql Session FactoryBenName注入に変更すれば大丈夫です。(sql Session Factory属性注入を使用しないでください。sql Session Factory BenNameを使用して注入します。)ここではすぐにSql Session Factoryを初期化しません。入ってくるのは名前だけです。springのproperties解析
一般的にPropertyPlace HolderConfigrerを使用してプレースホルダを置換します。例えば、
classpath:com/foo/strategy.properties
custom.strategy.class=com.foo.DefaultStrategy
spring 2.5以降は、使用できます。その本質はProptyPlaceholderConfigrer(3.1前)またはProptySources PlaceholderConfigrer(3.1後)を登録したことである。
注意:PropertyPlace HolderConfigrerに内蔵されている機能は非常に豊富であり、もしそれが$xxxで定義されているxxxキーを見つけられなかったら、JVMシステムの属性(System.get Property()と環境変数(System.getetetectv)の中で探すことができます。system PropertiesModeとsearch System Evironment属性を有効にすることで、開発者はこの行動をコントロールすることができます。PropertySources PlaceholderConfigrerはこの基礎の上でEnmentとPropertySourceと協力するのがもっと良いです。また、PropertyPlaceholderBeanDefinitionParsserの親類の中でShuldGenerate Idはtrueに戻ります。つまり、デフォルトではbeanごとに一意の名前が生成されます。2つのProptySources Placeholder Configrerを使用した場合、本質はBenFactoryPostProcessorsorであり、springを実施する時にこのbeanがOrderedを実現したと発見されたら、順次実行される;デフォルトの無秩序; 3、このときたとえば この時、まずorder='1'をスキャンします。もしorder='2'をスキャンしなかったら 4、デフォルトの状況ではignore-unreolvable;見つかっていない場合は異常を投げますか?デフォルトのfalse:例外を投げる;