0

在过去的几天里,我一直在为此苦苦挣扎。我正在尝试在容器外测试 DAO,但在运行测试用例时出现错误:

在类路径资源 [applicationContext.xml] 中创建名称为“SqlMapClient”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException

我正在使用 NB 运行测试。人们一直在说我需要上面的类在测试用例的运行时类路径中。但是,我绝对找不到那个罐子实际上在哪里......??我已将我的项目 lib 文件夹中的容器类路径 + jar 中的所有 jar 包含到单元测试的运行时类路径中。我仍然得到同样的错误。

谷歌搜索这个 JAR 也没有用。

也许有人知道从哪里得到这个该死的罐子。希望这能解决我的问题。

4

1 回答 1

2

这并不能直接回答您的问题,但我有两个建议。首先,既然我知道您正在使用 Spring,我建议您停止使用您自己的ServiceLocator来查找 JNDI 数据源,正如您在上一个问题中提到的那样。相反,您应该为此使用 Spring 工具,然后将数据源注入您的 bean。要获取 JDNI 数据源,请使用 Spring's 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>

这确实是推荐的方法(有关不同选项的更多详细信息,请查看使用 JDBC 访问数据一章)。

PS:我不知道com/iplanet/ias/admin/common/ASException从哪里来,但它显然是 iPlanet 本身之一。如果您真的想找出答案,请在 iPlanet 安装的所有 jar 中搜索,尤其是在其启动脚本中引用的那个。但我认为,在那之后你将面临 JNDI 问题,请注意。

于 2009-11-12T07:36:07.520 回答