In my application, I have exposed a dynamic MBean. I use JConsole to update the attribute of that bean. When setAttribute() is called, I update the object in the database. But the database update fails and I see the following stack trace in my application log file:
Code:org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nest ed exception is java.lang.IllegalArgumentException: interface org.hibernate.jdbc.ConnectionWrapper is not visible from c lass loader at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:550) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTra nsactionManager.java:377) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(Transaction AspectSupport.java:263) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635) at test.BeanDao$$EnhancerByCGLIB$$f06d99f4.updateConnectionProperty(<generated>) at test.DynamicMBean.setAttribute(DynamicMBean.java:257) at com.sun.jmx.mbeanserver.DynamicMetaDataImpl.setAttribute(DynamicMetaDataImpl.java:180) at com.sun.jmx.mbeanserver.MetaDataImpl.setAttribute(MetaDataImpl.java:206) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.setAttribute(DefaultMBeanServerInterceptor.java:737) at com.sun.jmx.mbeanserver.JmxMBeanServer.setAttribute(JmxMBeanServer.java:722) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1433) at javax.management.remote.rmi.RMIConnectionImpl.access$100(RMIConnectionImpl.java:81) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1247) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1343) at javax.management.remote.rmi.RMIConnectionImpl.setAttribute(RMIConnectionImpl.java:681) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294) at sun.rmi.transport.Transport$1.run(Transport.java:153) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:149) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707) at java.lang.Thread.run(Thread.java:595) Caused by: java.lang.IllegalArgumentException: interface org.hibernate.jdbc.ConnectionWrapper is not visible from class loader at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) at org.hibernate.jdbc.BorrowedConnectionProxy.generateProxy(BorrowedConnectionProxy.java:67) at org.hibernate.jdbc.ConnectionManager.borrowConnection(ConnectionManager.java:163) at org.hibernate.jdbc.JDBCContext.borrowConnection(JDBCContext.java:111) at org.hibernate.impl.SessionImpl.connection(SessionImpl.java:359) at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:463)
My code is as follows:
In MyDynamicMBean.java
In BeanDao.javaCode:public void setAttribute(Attribute attribute) { String name = attribute.getName(); Object value = attribute.getValue(); beanDao.updateConnectionProperty(bean, name, value); }
My spring bean xml file:Code:@Transactional(propagation=Propagation.REQUIRED) public void updateConnectionProperty(MyBean bean, String name, Object value) { bean.setConnectionProperty(name, (String)value); Session s = sessionFactory.openSession(); s.setFlushMode(FlushMode.MANUAL); s.update(bean); s.flush(); s.close(); }
Code:<!-- Hibernate Session Factory --> <bean id="spring.hibernate.sessionfactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="annotatedClasses"> <list> <value>...</value> <value>...</value> </list> </property> <property name="dataSource"><ref bean="spring.jdbc.dataSource"/></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <!-- enable the configuration of transactional behavior based on annotations --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- Transaction Manager --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="spring.hibernate.sessionfactory"/> </bean> <!-- Data Source --> <bean id="spring.jdbc.dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> <property name="url"><value>jdbc:mysql://localhost/model_config</value></property> <property name="username"><value>root123</value></property> <property name="password"><value>pass123</value></property> </bean> <bean id="test.BeanDao" class="test.BeanDao"> <property name="sessionFactory"><ref local="spring.hibernate.sessionfactory"/></property> </bean>
When I update the attribute from my JUnit test, all is successful and the value is updated in the database. But when I use JConsole, I run into this exception.
Any help will be much appreciated.


Reply With Quote