一般我们使用hibernate,最喜欢用的应该就是hql查询吧,较为灵活写法也跟sql相似,不过有的同志喜欢用criteria查询的可能不会看到这个异常信息,呵呵。
今天把一hibernate war项目部署到wl10.3.3上,部署是不会报错的,但是当你点到某个功能,这个功能下面有hql查询,就会报错,报错信息如下:
java.lang.RuntimeException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]; nested exception is org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]
at …
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.doIt(WebAppServletContext.java:3686)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2268)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
>
通过自己做的JarFinder小工具,明显可以在部署的war包中看到 org.hibernate.hql.ast.HqlToken 类,在hibernate-core-3.3.0.GA.jar中,这报错不正常啊,估计就是某些包跟wl冲突了,后来google了一下,找到一个国外的帖子,说是antlr的问题,亲身试验了一次,果然是这个问题,现在就把解决方法跟大家分享下:
将你的war包打入ear包中,当然你还需要有META-INF文件,带有weblogic-application.xml和application.xml,主要就是在weblogic-application.xml中解决,声明prefer-application-packages,如下所示(关键line3-5):
<?xml version="1.0" encoding="UTF8"?>
<weblogic-application>
<prefer-application-packages>
<package-name>antlr.*</package-name>
</prefer-application-packages>
</weblogic-application>
而application.xml就较为简单了,这里就不说了,相信打过ear包的都应该知道怎么回事,呵呵.打包后再次发布,问题解决。
附上解决问题原帖链接:http://forum.springsource.org/showthread.php?t=36860
不会写application.xml的可以参考一下java的dtd:http://java.sun.com/dtd/
再附上一篇08年的英文文章,blogspot的,讲的是weblogic jws+spring+hibernate开发的,需要翻墙才能看到:http://timezra.blogspot.com/2008/09/spring-hibernate-and-jax-ws-webservices.html
欢迎讨论~
原文链接:http://www.shaojiahao.org/java/hibernate/weblogic-hibernate-hql-problem