プロが教える店舗&オフィスのセキュリティ対策術

Struts2、Spring、iBATIS で勤務管理サイトを
勉強の為に作成しているのですが、どうしても
わからないエラーが発生してしまい、質問させて
いただきました。

【事象】
・eclipseよりサーバでの実行を起動させた際ですが、
 @ResourceでDAOのBeanを注入時にエラーが発生してしまいます。
 ※@Resourceを外せば当事象のエラーは発生しませんでした。

【applicationContext.xml】抜粋
<bean id="splMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" scope="singleton">
<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="loginDao" class="login.LoginDao" scope="singleton">
<property name="splMapClient" ref="splMapClient"></property>
</bean>

【sqlMapConfig.xml】
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dt …
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
statementCachingEnabled="true"
enhancementEnabled="true"
classInfoCacheEnabled="true"
lazyLoadingEnabled="false"
/>
<sqlMap url="file:c:/eclipse/workspace/tiles/WebContent/WEB-INF/sql/login.xml" />
</sqlMapConfig>

【Login.java】
package login;
import java.util.Map;
import javax.annotation.Resource;
import jp.co.hershe.struts2.util.Struts2Action;
import com.opensymphony.xwork2.ActionSupport;

@Struts2Action("Login")
public class Login extends ActionSupport {
private static final long serialVersionUID = 1L;

@Resource
private LoginDao loginDao;

@Override
public String execute() throws Exception {
(もろもろ処理が入ります)
}
}

【エラーログ】
情報: Loaded JDBC driver: oracle.jdbc.driver.OracleDriver
2009/06/26 1:05:28 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
情報: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@269997: defining beans [org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,Login,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,login,transactionManager,dataSource,TransactionInterceptor,splMapClient,loginDao]; root of factory hierarchy
2009/06/26 1:05:28 org.springframework.web.context.ContextLoader initWebApplicationContext
致命的: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginDao' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'splMapClient' of bean class [login.LoginDao]: No property 'splMapClient' found
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
at
……
==================================================
sqlMapClientのあたりで記述がおかしいのかと思いまして
見直しや検索などしてみたのですが、わからず、、
わかる方いらっしゃいましたらご教授ください。
よろしくお願いいたします。

A 回答 (3件)

ただのtypoだと思います。


splMapClient(えすぴーえる)ではなく、sqlMapClient(えすきゅーえる)ではないでしょうか?

この回答への補足

すいません。。
勉強の為にご教授いただきたいのですが、
ちなみに、applicationContext.xmlで指定して
いるBean idのsqlMapClientというのは固定で
どこかに定義されているものなのでしょうか、、
 ※クラス名の頭文字を小文字にしたidを定義
  する決まりがどこかに記載されているので
  しょうか?

applicationContext.xml内では、誤った
「splMapClient」で一致していたので問題
無いのかな、、と思っていたのが問題でした。。
度々で申し訳ありませんが、ご存知でしたら
教えてください。

補足日時:2009/06/29 01:09
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
お恥ずかしい限りです。ご指摘の通り修正した
ところ直りました。ありがとうございました。

お礼日時:2009/06/29 00:34

きちんと動作したようで何よりです。


下の補足の件ですが、Idは自由につけて問題ありません。
今回問題になったのは下記の記述のproperty="splMapClient"です。

<bean id="loginDao" class="login.LoginDao" scope="singleton">
<property name="splMapClient" ref="splMapClient"></property>
</bean>

Daoはあるクラスを継承して作成していますよね?
そのクラスにはsetSqlMapClientというメソッドがあるはずです。最初の記述のままですと、
loginDao.setSplMapClient(refで記述したBean)
という意味になるのでそんなSetterは無くてエラーになったというわけです。
property name="sqlMapClient"と修正するだけで動くはずです。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。
DaoはSqlMapClientDaoSupportクラスを継承
していました(APIも確認しました)。
propertyのnameとrefについて理解いたしました。
この度は本当にありがとうございました。

お礼日時:2009/06/29 12:47

私もこの構成(Struts2/Spring/iBatis)で自分なりのフレームワーク作ってますよ



Invalid property 'splMapClient' of bean class [login.LoginDao]: No property 'splMapClient' found

と言われているので、LoginDao のフィールドに splMapClient がないか、
そのsetterがないとかではないでしょうか?
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
tamtam180さんのご指摘のあった箇所を修正した
ところ動きました。ありがとうございました。

お礼日時:2009/06/29 01:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!