【发布时间】:2014-03-11 14:52:42
【问题描述】:
我在尝试使用 Hibernate 写入数据库时遇到了一些错误。
我正在关注本指南,但我想改用 MySQL:http://www.gwtproject.org/articles/using_gwt_with_hibernate.html
我有一个带有 ID 和名称的用户类(以及休眠映射文件)、一个 UserService、UserServceAsync、一个 UserServiceImpl 和一个 HibernateUtil 类。
当我尝试将用户添加到数据库时,我得到以下信息:
mar 11, 2014 2:38:47 EM com.google.appengine.tools.development.ApiProxyLocalImpl log
Allvarlig: javax.servlet.ServletContext log: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.Long com.coma.comaexjobb.client.UserService.saveUser(com.coma.comaexjobb.shared.Users)' threw an unexpected exception: java.lang.NoClassDefFoundError: org/hibernate/service/ServiceRegistry
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:265)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:305)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
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:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:487)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/service/ServiceRegistry
at com.coma.comaexjobb.server.UserServiceImpl.saveUser(UserServiceImpl.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
... 40 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.service.ServiceRegistry
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:216)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 47 more
有人知道我做错了什么吗? (如果对您有帮助,我可以在这里发布我的课程)非常感谢!
2014 年 3 月 13 日更新
主类
public void onModuleLoad() {
final UserServiceAsync userAsync = (UserServiceAsync) GWT.create(UserService.class);
final Button addRecord = new Button("Add Record");
RootPanel.get("topDiv").add(addRecord);
// Setup click handler to add selected record to selected account.
addRecord.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Long test= 123456L;
Users user = new Users(test);
// Persist the record to the account.
userAsync.saveUser(user,
new AsyncCallback<Long>() {
@Override
public void onFailure(Throwable caught) {
//Window.alert("Failed to save records to account.");
System.out.println("FAILURE");
}
@Override
public void onSuccess(Long result) {
// TODO Auto-generated method stub
}
});
UserService.java
package com.coma.comaexjobb.client;
import java.util.List;
import com.coma.comaexjobb.shared.Users;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("hibbeServlet")
public interface UserService extends RemoteService {
public List<Users> getUsers();
public Long saveUser(Users user);
}
UserServiceAsync.java
package com.coma.comaexjobb.client;
import java.util.List;
import com.coma.comaexjobb.shared.Users;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface UserServiceAsync {
public void getUsers(AsyncCallback<List<Users>> callback);
public void saveUser(Users user, AsyncCallback<Long> callback);
}
UserServiceImpl.java
package com.coma.comaexjobb.server;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import com.coma.comaexjobb.Util.HibernateUtil;
import com.coma.comaexjobb.client.UserService;
import com.coma.comaexjobb.shared.Users;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sun.java.swing.plaf.windows.resources.windows;
public class UserServiceImpl extends RemoteServiceServlet implements
UserService {
@Override
public List<Users> getUsers() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<Users> users = new ArrayList<Users>(session.createQuery("from Users").list());
session.getTransaction().commit();
return users;
}
@Override
public Long saveUser(Users user) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
return user.getId();
}
}
Users.java
package com.coma.comaexjobb.shared;
public class Users implements java.io.Serializable {
private Long UsersID;
private String name;
public Users() {
}
public Users(Long id) {
this.UsersID = id;
}
public Long getId() {
return this.UsersID;
}
public void setId(Long id) {
this.UsersID = id;
}
}
HibernateUtil.java
package com.coma.comaexjobb.Util;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
public static SessionFactory getSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee">
<!-- Servlets -->
<servlet>
<servlet-name>hibbeServlet</servlet-name>
<servlet-class>com.coma.comaexjobb.server.UserServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hibbeServlet</servlet-name>
<url-pattern>/comaexjobb/hibbeServlet</url-pattern>
</servlet-mapping>
<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>ComaExjobb.html</welcome-file>
</welcome-file-list>
</web-app>
【问题讨论】:
-
您的班级似乎不存在:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/service/ServiceRegistry -
但是 serviceRegistry 包含在 Hibernate 中。我正在使用 serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry);因为 buildSessionFactory() 被贬低了。
-
@Johan 上面的代码中没有显示任何编译错误
-
@CodeHunter 不,GWT 站点启动正常。当我按下按钮时会触发错误,并且粘贴的堆栈跟踪是我得到的唯一错误。稍后我会为您提供更多代码。
-
@JohanMagnusson 看来代码还可以,但是 GWT 加载程序无法识别您放置的休眠 jar(只是 CLASSPATH 问题)。