- PR -

Spring applicationContext.xmlのdataSourceの定義

1
投稿者投稿内容
ピーナッツ
会議室デビュー日: 2004/07/15
投稿数: 7
投稿日時: 2004-07-15 13:24
トランザクション制御をするために
dataSoruce の定義を以下のようにすると起動時に、「org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'daoTarget' defined in resource [/WEB-INF/applicationContext.xml] of ServletContext: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [dao.JDBCdao]: Property 'dataSource' is not writable
org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [dao.JDBCdao]: Property 'dataSource' is not writable」

とうエラーになります。原因がわかりません。
Springのソースを追っていくと、DriverManagerDataSourceクラスに
それぞれのpropertyにvalueで設定した値は設定されているようです。
どなたかわかる方、ご教授願います。


<bean
id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@XXXX:9999:XXXXX</value>
</property>
<property name="username"><value>XXX</value>
</property>
<property name="password"><value>XXX</value>
</property>
</bean>

<bean id="daoTarget" class="dao.JDBCdao">
<property name="dataSource"><ref="dataSource"/></property>
</bean>
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-15 14:05
Springは触ったことないのですが、エラーメッセージから推測すると、
引用:

ピーナッツさんの書き込み (2004-07-15 13:24) より:
<bean id="daoTarget" class="dao.JDBCdao">
<property name="dataSource"><ref="dataSource"/></property>
</bean>


dao.JDBCdaoクラスにpublicなsetDataSourceメソッドがないのではないですか?
または引数の型が間違っていませんか?
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 2004-07-16 09:04
同じapplicationContext.xml内の場合、
<ref local="dataSource" />
じゃなかったでしたっけ?
ピーナッツ
会議室デビュー日: 2004/07/15
投稿数: 7
投稿日時: 2004-07-16 10:55
ukさん
 <bean id="daoTarget" class="dao.JDBCdao">
で指定したdao.JDBCdaoクラスで継承するクラス(org.springframework.jdbc.core.support.JdbcDaoSupport)を指定してませんでした。
ご指摘どおり、親クラスでsetDataSourceメソッドがあるので、
起動するようになりました。ありがとうございます。


ピーナッツ
会議室デビュー日: 2004/07/15
投稿数: 7
投稿日時: 2004-07-16 11:10
latteさん
実際のapplicationContext.xmlは以下のようになっています。
私のここに載せるための編集ミスです。すみません。
<ref local="dataSource" />

ピーナッツ
会議室デビュー日: 2004/07/15
投稿数: 7
投稿日時: 2004-07-16 11:13

UKさんのおかげで、起動はするようにはなったのですが、
アクションクラスで、beanの"manager"のインスタンスを取得する個所で

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'XXXManager' defined in resource [/WEB-INF/applicationContext.xml] of ServletContext: 1 constructor arguments specified but no matching constructor found in bean 'XXXManager' (hint: specify index arguments for simple parameters to avoid type ambiguities)

のエラーになります。
コードは以下のようにして
XXXManager logic = (XXXManager)WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet().getServletContext()).getBean("XXXManager");
インスタンスを取得しています。
<bean
id="XXXManager"

<constructor-arg index="0" type="dao.manageDao">
<ref bean="daoTarget" />
</constructor-arg>
の指定が間違っているのでしょうか?
指定したクラスパスはすべて合っています。

=============================================================================================
apalicationContext.xml 全文です。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-lazy-init="false" default-dependency-check="none" default-autowire="no">
<bean
id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@XXXX:9999:XXXXX</value>
</property>
<property name="username"><value>XXX</value>
</property>
<property name="password"><value>XXX</value>
</property>
</bean>

<bean
id="XXXManager"
class="logic.XXXManager"
singleton="false"
lazy-init="default"
autowire="default"
dependency-check="default"
>
<constructor-arg index="0" type="dao.manageDao">
<ref bean="daoTarget" />
</constructor-arg>
</bean>

<bean id="daoTarget" class="dao.JDBCdao">
<property name="dataSource"><ref="dataSource"/></property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>

<bean id="XXXDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target"><ref bean ="daoTarget"/></property>
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED , readOnly</prop>
<prop key="update*">PROPAGATION_REQUIRED , -java.lang.Exception</prop>
</props>
</property>
</bean>
=============================================================================================
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-16 13:24
またまたエラーメッセージからの推測なんですが、logic.XXXManagerクラスのコンストラクタに、
引用:

ピーナッツさんの書き込み (2004-07-16 11:13) より:

<constructor-arg index="0" type="dao.manageDao">
<ref bean="daoTarget" />
</constructor-arg>


この設定に該当するものがない、といっているようです。要するにdao.manageDao型の引数を
一つ取るコンストラクタが必要なはずですが、logic.XXXManagerクラスのコードはどうなって
いるのでしょうか。
ピーナッツ
会議室デビュー日: 2004/07/15
投稿数: 7
投稿日時: 2004-07-16 16:24
ukさん

ご指摘のとおり、dao.manageDao型の引数とるコンストラクタを追加したところ、
うまく動きました。
とっても助かりました。
本当に、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)