JBoss 7 Oracle XMLType retrieval problem
knightblue610 Jan 2, 2013 1:32 PMWe have been using JBoss 6.1.0.Final with Hibernate 4.2 with a custom UserType to map Oracle XMLType columns to our Hibernate entities. In order to do so, I added the files ojdbc6.jar, xmlparserv2.jar, orai18n.jar, orai18n-collation.jar, and xmlparserv2.jar to the $JBOSS_HOME/lib directory. It works quite well.
We would like to move to JBoss 7.1.3.Final, and so I created a module called "com.oracle.ojdbc6" by creating $JBOSS_HOME/modules/com/oracle/ojdbc6/main and putting the same JAR files in there. This is what my module.xml looks like:
{code:xml}<?xml version="1.0" ?>{code}
{code:xml}
<module xmlns="urn:jboss:module:1.1" name="com.oracle.ojdbc6">
<resources>
<resource-root path="ojdbc6.jar"/>
<resource-root path="xdb6.jar"/>
<resource-root path="xmlparserv2.jar"/>
<resource-root path="orai18n-collation.jar"/>
<resource-root path="orai18n.jar"/>
<resource-root path="xercesImpl.jar" />
<!-- Insert resources here -->
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
{code}
Then I added the dependency through jboss-deployment-structure.xml in our EAR file in the appropriate location (Hibernate dependencies are excluded because the version of Hibernate that we were using was newer than what came with 7.1.3):
{code:xml}
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<deployment><exclusions>
<module name="org.hibernate" slot="main"/></exclusions>
<dependencies><module name="org.slf4j.ext" slot="main" />
<module name="org.apache.log4j" slot="main" /></dependencies>
</deployment>
<sub-deployment name="updater-1.2.0-SNAPSHOT.war">
<exclusions>
<module name="org.hibernate" slot="main"/>
</exclusions>
<dependencies> <module name="org.slf4j.ext" slot="main" /><module name="org.apache.log4j" slot="main" />
<module name="com.oracle.ojdbc6" slot="main" /><module name="deployment.gdm-ear.ear.common-1.2.0-SNAPSHOT.jar" />
</dependencies>
</sub-deployment>
<sub-deployment name="collator-1.1.0-SNAPSHOT.war">
<dependencies>
<module name="org.slf4j.ext" slot="main" />
<module name="org.apache.log4j" slot="main" />
<module name="com.oracle.ojdbc6" slot="main" /></dependencies>
</sub-deployment>
<sub-deployment name="audit-1.0.2-SNAPSHOT.war">
<dependencies>
<module name="org.slf4j.ext" slot="main" />
<module name="org.apache.log4j" slot="main" />
</dependencies>
</sub-deployment>
<sub-deployment name="common-1.2.0-SNAPSHOT.jar">
<dependencies>
<module name="org.slf4j.ext" slot="main" />
<module name="org.apache.log4j" slot="main" />
<module name="com.oracle.ojdbc6" slot="main" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
{code}
The code deploys and runs up to the point where it retrieves an XMLType from the database using nullSafeGet. Here is that method:
{code}
@Override
public Object nullSafeGet(ResultSet rs, String[] names,
SessionImplementor session, Object owner)
throws HibernateException, SQLException
{
XMLType xmlData = (XMLType) rs.getSQLXML(names[0]);
XMLDocument doc;
if (xmlData == null)
{
doc = null;
}
else
{
try
{
BinXMLStream stream = xmlData.getBinXMLStream();
BinXMLDecoder decoder = stream.getDecoder();
InfosetReader reader = decoder.getReader();
XMLDOMImplementation domImpl = new XMLDOMImplementation();
domImpl.setAttribute(XMLDocument.SCALABLE_DOM, true);
domImpl.setAttribute(XMLDocument.ACCESS_MODE,
XMLDocument.UPDATEABLE);
doc = (XMLDocument) domImpl.createDocument(reader);
}
catch (IllegalArgumentException e)
{
throw new HibernateException(e);
}
catch (DOMException e)
{
throw new HibernateException(e);
}
catch (BinXMLException e)
{
throw new HibernateException(e);
}
finally
{
if(xmlData != null)
{
xmlData.close();
}
}
}
}
{code}
When the code reaches this line:
{code}
XMLType xmlData = (XMLType) rs.getSQLXML(names[0]);
{code}
I see this exception:
{code}
11:54:09,034 WARN [org.jboss.jca.core.connectionmanager.listener.NoTxConnectionListener] (trChannelTaskExecutor-1) IJ000305: Connection error occured: org.jboss.jca.core.connectionmanager.listener.NoTxConnectionListener@78a8ac79[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@2dfd574b connection handles=1 lastUse=1356717165759 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@536e1483 pool internal context=SemaphoreArrayListManagedConnectionPool@6004cf3f[pool=tl]]: java.lang.NullPointerException
at oracle.jdbc.driver.NamedTypeAccessor.getOracleObject(NamedTypeAccessor.java:302) [ojdbc6.jar:11.2.0.3.0]at oracle.jdbc.driver.NamedTypeAccessor.getSQLXML(NamedTypeAccessor.java:413) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.OracleResultSetImpl.getSQLXML(OracleResultSetImpl.java:1251) [ojdbc6.jar:11.2.0.3.0]at oracle.jdbc.driver.OracleResultSet.getSQLXML(OracleResultSet.java:488) [ojdbc6.jar:11.2.0.3.0]
at org.jboss.jca.adapters.jdbc.WrappedResultSet.getSQLXML(WrappedResultSet.java:3264)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_33]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_33]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_33]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_33]
at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:104) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]at $Proxy73.getSQLXML(Unknown Source) at com.acxiom.dnb.toplayer.types.HibernateXMLDocument.nullSafeGet(HibernateXMLDocument.java:89) [common-1.2.0-SNAPSHOT.jar:]
at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:124) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:106) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2702) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1541) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1473) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.getRow(Loader.java:1373) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:640) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.doQuery(Loader.java:850) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2447) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2433) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2263) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.Loader.list(Loader.java:2258) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1697) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:227) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
at com.acxiom.dnb.toplayer.gdm.dao.impl.GdmCombinedDaoImpl.getRecord(GdmCombinedDaoImpl.java:90) [common-1.2.0-SNAPSHOT.jar:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_33]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_33]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_33]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_33]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) [spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at $Proxy63.getRecord(Unknown Source) at com.acxiom.dnb.toplayer.gdm.updater.impl.GdmUpdateManagerImpl.updateGdm_aroundBody0(GdmUpdateManagerImpl.java:90) [classes:]
at com.acxiom.dnb.toplayer.gdm.updater.impl.GdmUpdateManagerImpl.updateGdm_aroundBody1$advice(GdmUpdateManagerImpl.java:25) [classes:]
at com.acxiom.dnb.toplayer.gdm.updater.impl.GdmUpdateManagerImpl.updateGdm(GdmUpdateManagerImpl.java:1) [classes:]
at com.acxiom.dnb.toplayer.gdm.updater.locking.GDMUpdaterLocking.processUpdates(GDMUpdaterLocking.java:180) [classes:]
at com.acxiom.dnb.toplayer.gdm.updater.locking.GDMUpdaterLocking.processUpdate(GDMUpdaterLocking.java:113) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_33]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_33]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_33]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_33]
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:69) [spring-expression-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:109) [spring-expression-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57) [spring-expression-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102) [spring-expression-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:102) [spring-expression-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:126) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.util.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:225) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.util.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:125) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:73) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:67) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:97) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:73) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:115) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.dispatcher.UnicastingDispatcher.access$000(UnicastingDispatcher.java:52) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.dispatcher.UnicastingDispatcher$1.run(UnicastingDispatcher.java:97) [spring-integration-core-2.1.3.RELEASE.jar:]
at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:52) [spring-integration-core-2.1.3.RELEASE.jar:]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_33]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_33]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_33]
{code}
Keep in mind that this worked in JBoss 6, and at that point, we've got a native OracleResultSet, so connections aren't an issue. I think that there is a type internally to Oracle that is not being loaded by the same classloader, but I'm not sure. Does anyone have any ideas as to what is going on?