You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring JPA混合Java与XML配置数据源启动报类型转换异常如何解决

异常触发原因
  1. 你在DataSourceConfig类中通过@Bean(name = "datasource")注解声明的getDataSource()方法返回的才是符合javax.sql.DataSource类型要求的数据源对象。
  2. 你在datasource.xml中错误将id="datasource"的bean指定为DataSourceConfig配置类本身,两个同名bean冲突后,XML中定义的配置类bean覆盖了Java配置生成的数据源bean。
  3. 当persistenceUnitManager注入defaultDataSource属性时,拿到的实际是DataSourceConfig的CGLIB代理实例,和要求的DataSource类型不匹配,因此抛出类型转换异常。
修复方案

可选择以下任意一种方案修改:

方案1:保留Java配置,修正XML引入方式

移除XML中错误加了id的配置类声明,正确引入Java配置类即可,Spring会自动解析配置类中的@Bean注解生成对应的数据源实例,修改后的datasource.xml配置如下:

<!-- 开启Spring注解配置支持 -->
<context:annotation-config/>
<!-- 注册DataSourceConfig配置类,不要加id="datasource",避免和@Bean生成的数据源bean重名冲突 -->
<bean class="com.package.datasource.DataSourceConfig"/>

<bean id="persistenceUnitManager"
        class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="persistenceXmlLocations">
            <list>
                <value>classpath*:META-INF/persist.xml</value>
            </list>
        </property>
        <!-- 这里ref的datasource就是DataSourceConfig里@Bean生成的合法数据源对象 -->
        <property name="defaultDataSource" ref="datasource" />
        <property name="dataSources">
            <map>
                <entry key="datasource" value-ref="datasource" />
            </map>
        </property>
</bean>

方案2:完全使用XML配置,移除Java配置类

如果你不需要混合Java配置和XML配置,也可以直接删除DataSourceConfig类,直接在XML中定义数据源bean即可:

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql://localhost:3309/example?autoReconnect=true"/>
    <property name="username" value="user"/>
    <property name="password" value="pwddb"/>
</bean>

<bean id="persistenceUnitManager"
        class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="persistenceXmlLocations">
            <list>
                <value>classpath*:META-INF/persist.xml</value>
            </list>
        </property>
        <property name="defaultDataSource" ref="datasource" />
        <property name="dataSources">
            <map>
                <entry key="datasource" value-ref="datasource" />
            </map>
        </property>
</bean>

内容的提问来源于stack exchange,提问作者Show me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:48:04