过去几天我一直在努力解决这个问题。我试图在容器外测试DAO,但在运行测试用例时我收到错误:
使用名称创建bean时出错 'SqlMapClient'在类中定义 路径资源 [applicationContext.xml]:调用 init方法失败;嵌套 例外是 java.lang.NoClassDefFoundError: COM /的iPlanet / IAS /管理/普通/ ASException
我正在使用NB来运行测试。人们一直在说我需要上面的类在测试用例的运行时类路径中。但是,我绝对无法找到那个罐子在哪里......?我已将我的项目lib文件夹中容器类路径+ jars上的所有jar包含到Unit测试的运行时类路径中。我仍然得到同样的错误。
谷歌搜索这个JAR也没有用。
也许有人在那里知道从哪里得到这个怪胎。希望能解决我的问题。
答案 0 :(得分:2)
这不直接回答你的问题,但我有两个建议。首先,既然我知道您正在使用Spring,我建议停止使用您自己的ServiceLocator
来查找JNDI数据源,就像您之前在question中提到的那样。相反,您应该使用Spring工具,然后将数据源注入您的bean。要获取JDNI数据源,请使用Spring的JndiObjectFactoryBean
,类似于:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:/comp/env/jdbc/myDS</value>
</property>
</bean>
然后,当在容器外运行时(通常在运行测试时),我的建议是不使用JNDI数据源。相反,您应该使用Spring工具以另一种方式向DAO提供数据源(例如,使用DriverManagerDataSource
,运行测试时不需要真正的连接池)。这将允许您运行测试而无需启动对测试有意义的iPlanet(并且您不想测试iPlanet的连接池,您想要测试您的DAO)。
因此,在测试期间使用另一个数据访问配置创建一个applicationContext-test.xml
。下面是DriverManagerDataSource
的示例配置:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="..."/>
<property name="url" value="..."/>
<property name="username" value="..."/>
<property name="password" value="..."/>
</bean>
这是推荐的方法(有关不同选项的详细信息,请查看Data access using JDBC一章)。
PS:我不知道com/iplanet/ias/admin/common/ASException
来自哪里,但它显然是iPlanet本身之一。如果您真的想知道,请在iPlanet安装的所有jar中搜索,尤其是在其启动脚本中引用的jar。但我认为,在此之后你将面临JNDI问题,请加以警告。