Reputation: 121998
While doing Hibernate migration, having issue with bean lib jar. As you can see I'm attached all the jars related to bean replicator.
At run time facing the issue :
11:56:33,354 ERROR [BeanPopulator]
propertyName=handler
readerMethod=public javassist.util.proxy.MethodHandler com.v4common.shared.beans.usermanagement.User_$$_jvstb35_4c.getHandler()
setterMethod=public void com.v4common.shared.beans.usermanagement.User_$$_jvstb35_4c.setHandler(javassist.util.proxy.MethodHandler)
fromBean=com.v4common.shared.beans.usermanagement.User@1
toBean=com.v4common.shared.beans.usermanagement.User_$$_jvstb35_4c@0
net.sf.beanlib.BeanlibException: java.lang.NoSuchMethodException: org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.<init>()
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:169)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:71)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:125)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:224)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:201)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:172)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:270)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:174)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:173)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:71)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:125)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:224)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:201)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:172)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:270)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:174)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:173)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:71)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:125)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:224)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:201)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:172)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:270)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:174)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:173)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:71)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:125)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:224)
at net.sf.beanlib.hibernate.HibernateBeanReplicator.copy(HibernateBeanReplicator.java:133)
at net.sf.beanlib.hibernate.HibernateBeanReplicator.copy(HibernateBeanReplicator.java:111)
at com.v4common.shared.util.other.ConversionUtil.copyProperties(ConversionUtil.java:364)
at com.nextenders.dao.UserDetailsDao.fetchAllPostForUser(UserDetailsDao.java:3368)
at com.nextenders.dao.UserDetailsDao.processsRequest(UserDetailsDao.java:119)
at com.nextenders.common.DaoReceiver.processRequest(DaoReceiver.java:86)
at com.nextenders.common.DaoHandler.handleRequest(DaoHandler.java:12)
at com.nextenders.facadeimplementation.facade.UserFacade.fetchAllPostForUser(UserFacade.java:1526)
at com.nextenders.facadeimplementation.facade.UserFacade.getDataOnLogIn(UserFacade.java:2671)
at com.nextenders.facadeimplementation.facade.UserFacade.doLogin(UserFacade.java:2356)
at com.nextenders.server.LoginServlet.doPost(LoginServlet.java:304)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
at com.nextenders.server.ExceptionHandler.doFilter(ExceptionHandler.java:28)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
at com.nextenders.server.BaseFilter.doFilter(BaseFilter.java:79)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
And you can see my classpath here.
Any clues on this ?
Thanks for any help.
Upvotes: 1
Views: 1465
Reputation: 21
I had an identical error, and I solved it by gettign some source jars and applying a few changes. The underlying cause of the erorr is that, by not recognising the Javassist class, the Beanlib attempts to clone the Javassist class which includes handler methods. Normally, it must clone the ancestor class. This is what the UnEnhance class does - finds the non-Javassist ancestor. In order to do so, it needs to be able to tell which classes have been created by Javassist
My starting point wasn't exactly the same as yours, because we used version 3.3.0beta20b of Beanlib, wheras you are on 5.0.1beta. However, the stack trace I got was identical to the one you are showing, so the solution may well apply to your case as well. Like yourself, we were on Javassist version 3.18.1-GA
In the BeanlibHibernate library, the class UnEnancer is responsible to identify classes which originate from Javassist.
An older version of Javassist produced class namees which contained the string "_$$javassist".
The newer version 3.18.1-GAproduces classes which contain the string "_$$_jvst". I can see the same string in your example above.
A very old version produces classnames beginning with ""org.javassist.tmp"
The method isJavassistEnhanced uses an OR condition to look for the "old" and the "very old" criteria. This needs to be modified, so the OR condition allows for a third case, when it looks for the "new" string.
Here is the code in UnEnhance.java before I changed it:
private static final String JAVASSIST_STARTWITH = "org.javassist.tmp.";
private static final String JAVASSIST_INDEXOF = "_$$_javassist_";
/**
* Returns true if the given class is found to be a javassist enhanced class;
* false otherwise.
*/
private static boolean isJavassistEnhanced(Class c) {
String className = c.getName();
// pattern found in javassist 3.4 and 3.6's ProxyFactory
return className.startsWith(JAVASSIST_STARTWITH)
|| className.indexOf(JAVASSIST_INDEXOF) != -1
;
}
And here it is after I changed it:
private static final String JAVASSIST_STARTWITH = "org.javassist.tmp.";
private static final String JAVASSIST_INDEXOF = "_$$_javassist_";
private static final String HB4_JAVASSIST = "_$$_jvst" ;
/**
* Returns true if the given class is found to be a javassist enhanced class;
* false otherwise.
*/
private static boolean isJavassistEnhanced(Class c) {
String className = c.getName();
// pattern found in javassist 3.4 and 3.6's ProxyFactory
boolean isEnhanced =
className.startsWith(JAVASSIST_STARTWITH)
|| className.indexOf(JAVASSIST_INDEXOF) != -1
|| className.in`enter code here`dexOf(HB4_JAVASSIST) != -1 // 3.18.1-GA
;
return isEnhanced ;
}
I found the sources at:
With this change, I could take it as fas as Hibernate 4.2.6 and GWT 2.5.0. I could not make the DTO and the newIdentifier functionality to work, but apparently these are not required by Hibernate4GWT
Upvotes: 2