Suresh Atta
Suresh Atta

Reputation: 121998

Hibernate migration :BeanlibException

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.

enter image description here

Any clues on this ?

Thanks for any help.

Upvotes: 1

Views: 1465

Answers (1)

Andrew Sc
Andrew Sc

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:

http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.net.sf.beanlib.hibernate&version=3.3.0.beta21

http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.net.sf.beanlib&version=3.3.0.beta21

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

Related Questions