Spring JPA混合Java与XML配置数据源启动报类型转换异常如何解决
异常触发原因
- 你在
DataSourceConfig类中通过@Bean(name = "datasource")注解声明的getDataSource()方法返回的才是符合javax.sql.DataSource类型要求的数据源对象。 - 你在
datasource.xml中错误将id="datasource"的bean指定为DataSourceConfig配置类本身,两个同名bean冲突后,XML中定义的配置类bean覆盖了Java配置生成的数据源bean。 - 当
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
相关产品推荐
相关产品推荐

