在容器外实例化spring bean(用于测试)

时间:2009-11-11 17:06:57

标签: java unit-testing spring ibatis

我在我的applicaionContext.xml中有以下内容

<bean id="IbatisDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@123.210.85.56:1522:ORCL"/>
    <property name="username" value="mydb"/>
    <property name="password" value="mydbpwd"/>
</bean>


<bean id="myMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
  <property name="dataSource" ref="IbatisDataSource"/>
 </bean>

然后在我的代码中我有:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
SqlMapClient sqlclient = (SqlMapClient) ctx.getBean("myMapClient");

这样做会给我带来以下错误:

  

使用名称创建bean时出错   'myMapClient'在课堂上定义   路径资源   [applicationContext.xml]:调用   init方法失败;嵌套   例外是   java.lang.NoClassDefFoundError:   COM /的iPlanet / IAS /管理/普通/ ASException

我不明白为什么要找那个班级?我试图在容器外做所有事情。所以它甚至不应该寻找那个类...但是只是为了让它工作我尝试寻找一个名为ASException的类,所以我可以把它放在类路径上但是没有我在哪里可以找到ASException类。

任何指针?

堆栈跟踪和我的编译测试/运行测试库的映像 alt text alt text alt text

修改 解: 即使我认为一切都在集装箱外面......但有一件事不在集装箱外面 注意属性configLocation:

<property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>

sql-map-config-oracle.xml的实际内容是

<sqlMapConfig>
   <settings enhancementEnabled="true" useStatementNamespaces="true" />
    <transactionManager type="JDBC">
        <dataSource type="JNDI">
            <property name="DataSource" value="my/jndi/mydb" />
        </dataSource>
    </transactionManager>
<sqlMap resource="somemapping.xml"/>
</sqlMapConfig>

JNDI的东西不需要在那里!

sql-map-config-oracle.xml应该只是:

<sqlMapConfig>
   <settings enhancementEnabled="true" useStatementNamespaces="true" />
        <sqlMap resource="somemapping.xml"/>
</sqlMapConfig>

2 个答案:

答案 0 :(得分:1)

你肯定有一个运行时依赖性问题,因为@Cletus说org.springframework.orm.ibatis.SqlMapClientFactoryBean是用com.iplanet.ias.admin.common.ASException编译的,但现在你没有在你的类路径中 - Spring找不到它。你应该查看SqlMapClientFactoryBean的来源,看看ASException被调用的地方 - Spring应该有一个包含所有依赖关系的dist,你也可以在调查时查看。

答案 1 :(得分:0)

此类在编译期间找到,但在运行期间未找到:

com/iplanet/ias/admin/common/ASException

因此,当您运行该程序时,它似乎无法找到此类,该类属于您正在使用的Sun应用程序或门户网站服务器。简而言之:这是一个类路径错误。