【问题标题】:instantiating spring bean outside the container (for testing)在容器外实例化spring bean(用于测试)
【发布时间】:2019-05-08 06:09:57
【问题描述】:

我的 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]:调用 初始化方法失败;嵌套的 例外是 java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException

我不明白它为什么要寻找那个类?我正在尝试在容器外做所有事情。所以它甚至不应该在寻找那个类......但为了让它工作,我尝试寻找名为 ASException 的类,以便我可以将它放在类路径中,但我在哪里可以找到 ASException 类。

任何指针?

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

编辑 解决方案: 尽管我认为一切都在容器之外……但有一件事不在容器之外。
注意属性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>

【问题讨论】:

    标签: java unit-testing spring ibatis


    【解决方案1】:

    正如@Cletus 所说,org.springframework.orm.ibatis.SqlMapClientFactoryBean 是用com.iplanet.ias.admin.common.ASException 编译的,你肯定有运行时依赖问题,但现在你的类路径中没有它——Spring 找不到它。您应该查看SqlMapClientFactoryBean 的源代码以查看调用ASException 的位置——Spring 应该有一个包含所有依赖项的dist,您也可以在进行调查时查看那里。

    【讨论】:

    • 用 src 下载了完整的 springframework。在所有类中搜索 src 文件夹中的字符串“AsException”....找到 nada。
    • 所以仔细观察,这一定是一个特定于容器的错误 iplanet 是 Sun 品牌的服务器等(Glassfish 等)。如果您像在 Netbeans 中的 Tomcat 实例上测试这种“容器外”,那么您似乎在这里仍然有一些容器参考。我认为ias 是iPlanet 应用程序服务器,而您得到ASException 应用程序服务器异常。我会创建一个新的 Netbeans 项目,导入你的代码、Spring iBatis 依赖项和 Spring(当然还有它的依赖项)以及你在 Spring 中找不到的代码依赖项。
    • 没有得到ASEXception 但你知道我的意思——而不是得到:)
    • 不,我明白你的意思...基本上从头开始:) 现在也要尝试。 ..也可以
    • 我成功了!而不是从头开始......尝试“从头开始思考”。感谢您的帮助
    【解决方案2】:

    这个类是在编译过程中发现的,但在运行过程中没有发现:

    com/iplanet/ias/admin/common/ASException
    

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

    【讨论】:

    • 你如何确定它是在编译中找到的?..错误发生在 bean 的初始化时..无论如何在编译时都不会发生,对吧? ...即使我不知道它需要哪个 jar 文件,但我认为编译和运行类路径都缺少 jar ..不仅仅是运行(或者我们不能确定)
    • 区分 ClassNotFoundException 和 ClassDefNotFoundError 很重要。例如,当您尝试通过反射实例化一个类但找不到它时,就会发生第一种情况。第二个发生是因为一些代码是针对运行时不再存在的类编译的。这就是你所拥有的。所以你可能会发现你没有包括你需要的所有罐子。就像您包含一个 jar 但不包含它所依赖的 jar,等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2012-11-30
    • 2017-04-23
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多