0

我是新来的斯普林斯。我正在尝试运行 JDBCTempalte 示例。我得到了 ClassCastException。这对我来说没有意义。

我的上下文文件

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- I have removed my config, I have tried JDBC code it is working with this datasource-->
</bean>

<bean id="jdbcDAO" class="com.sarma.spring.jdbcEx.JDBCDAOImpl">
<property name="dataSource" ref="dataSource"/><!-- This is my jdbc example it is working-->
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

我的主要课程

try{
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
org.springframework.jdbc.core.JdbcTemplate jdbc = (org.springframework.jdbc.core.JdbcTemplate)context.getBean("jdbcTemplate");
String query = "SELECT ACNT_NBR FROM eit.ACNT WHERE ACNT_ID=13057";
int o= jdbc.queryForInt(query);
}catch(Exception e){
    e.printStackTrace();
}

输出

2013-10-08 16:43:34 INFO  ClassPathXmlApplicationContext:513 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c672d0: startup date [Tue Oct 08 16:43:34 EDT 2013]; root of context hierarchy
2013-10-08 16:43:34 INFO  XmlBeanDefinitionReader:316 - Loading XML bean definitions from class path resource [applicationContext.xml]
2013-10-08 16:43:34 INFO  DriverManagerDataSource:133 - Loaded JDBC driver: oracle.jdbc.driver.OracleDriver
java.lang.ClassCastException: $Proxy12 cannot be cast to org.springframework.jdbc.core.JdbcTemplate
    at com.sarma.spring.jdbcEx.main.JdbcExMain.main(JdbcExMain.java:45)

我的 45 行是

org.springframework.jdbc.core.JdbcTemplate jdbc = (org.springframework.jdbc.core.JdbcTemplate)context.getBean("jdbcTemplate");

我有错吗??谢谢你的帮助

谢谢,

CVSR 萨尔玛

4

1 回答 1

3

除非需要应用一些特殊的外部行为,否则通常不会代理 Spring bean。例如,AOP 建议事务管理bean 范围等。

您的上下文似乎不完整。如果您声明了一些与方法匹配的 AOP 连接点JdbcTemplate,那么该 bean 将被代理。您可以指定代理设置,例如,如果 Spring 应该proxy-target-class而不是 interface。如果您的类路径上有 CGLIB 库,则通过设置应该没有任何问题

<aop:config proxy-target-class="true"> ...

JDK代理的一个小例子

public static void main(String[] args) throws Exception {
    JdbcTemplate template = new JdbcTemplate();
    Object proxy = Proxy.newProxyInstance(template.getClass().getClassLoader(), template.getClass().getInterfaces(), new ProxyJdbcTemplateHandler(template));
    System.out.println(proxy.getClass());
    System.out.println(proxy.getClass().getSuperclass());
    System.out.println(Arrays.toString(proxy.getClass().getInterfaces()));
}

public static class ProxyJdbcTemplateHandler implements InvocationHandler {
    private JdbcTemplate target;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // do something with target
        return null;
    }

    public ProxyJdbcTemplateHandler(JdbcTemplate target) {
        this.target = target;
    }
}

印刷

class $Proxy0
class java.lang.reflect.Proxy
[interface org.springframework.jdbc.core.JdbcOperations]

代理具有 的超接口的类型JdbcTemplate,但没有类型本身。它的父类实际上是Proxy. 为此,您需要使用 CGLIB 代理,方法是在类路径中提供 CGLIB jar 并proxy-target-class="true"在配置中指定。

于 2013-10-08T21:14:24.643 回答