Friday, July 18, 2014

tomcat oracle spring BLOB OracleLobCreator exception error

I recently switched from an older version of Tomcat 5.5 to 7.0. This created an error because the newer version of tomcat creates database connection pools differently. The error pops up in my application when I try to upload a file, because it creates a BLOB type, which this new pool object doesn't support.

ERROR message: document update Blob error exception:org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on [oracle.jdbc.OracleConnection], not on [org.apache.tomcat.dbcp.dbcp.PoolableConnection]: specify a corresponding NativeJdbcExtractor; nested exception is java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.PoolableConnection cannot be cast to oracle.jdbc.OracleConnection

my original Spring beans XML file:
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor" lazy-init="true"/>
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
 <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/>
</bean>
As you can see, I was using WebSphereNativeJdbcExtractor as the LOB handler, but tomcat passes it's own implementation of the Oracle database connection to the Spring class. I changed it to:
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor" lazy-init="true"/>
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
 <property name="nativeJdbcExtractor" ref="commonsDbcpNativeJdbcExtractor"/>
</bean>
<bean id="commonsDbcpNativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/></b>
This works!

No comments:

Post a Comment