2011-11-27 88 views
4

我想做一個簡單的GWT RPC Hibernate程序,將用戶添加到MySQL數據庫中。我正在使用Eclipse EE。應用程序成功將用戶添加到數據庫,但編譯時引發異常。 這裏是我的應用程序的例外&。在gwt hibernate程序中的異常

例外:

Exception in thread "UnitCacheLoader" java.lang.RuntimeException: Unable to read from byte cache 
    at com.google.gwt.dev.util.DiskCache.transferFromStream(DiskCache.java:166) 
    at com.google.gwt.dev.util.DiskCacheToken.readObject(DiskCacheToken.java:87) 
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) 
    at java.io.ObjectInputStream.readSerialData(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source) 
    at java.io.ObjectInputStream.readSerialData(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at com.google.gwt.dev.javac.PersistentUnitCache.loadUnitMap(PersistentUnitCache.java:493) 
    at com.google.gwt.dev.javac.PersistentUnitCache.access$000(PersistentUnitCache.java:92) 
    at com.google.gwt.dev.javac.PersistentUnitCache$UnitCacheMapLoader.run(PersistentUnitCache.java:122) 
Caused by: java.io.StreamCorruptedException: unexpected EOF in middle of data block 
    at java.io.ObjectInputStream$BlockDataInputStream.refill(Unknown Source) 
    at java.io.ObjectInputStream$BlockDataInputStream.read(Unknown Source) 
    at java.io.ObjectInputStream.read(Unknown Source) 
    at java.io.InputStream.read(Unknown Source) 
    at com.google.gwt.dev.util.DiskCache.transferFromStream(DiskCache.java:154) 
    ... 16 more 

入口點類:

package rpctest.client; 

import rpctest.shared.FieldVerifier; 
import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.core.client.GWT; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.event.dom.client.KeyCodes; 
import com.google.gwt.event.dom.client.KeyUpEvent; 
import com.google.gwt.event.dom.client.KeyUpHandler; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.DialogBox; 
import com.google.gwt.user.client.ui.HTML; 
import com.google.gwt.user.client.ui.HorizontalPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.TextBox; 
import com.google.gwt.user.client.ui.VerticalPanel; 

/** 
* Entry point classes define <code>onModuleLoad()</code>. 
*/ 
public class Rpctest implements EntryPoint { 

    final TextBox firstName = new TextBox(); 
    final TextBox lastName = new TextBox(); 
    final Button ans = new Button("Add User"); 
    final Label label1 = new Label("First Name"); 
    final Label label2 = new Label("Last Name"); 
    //final Label errorLabel = new Label(); 
    private VerticalPanel mainpanel = new VerticalPanel(); 
    private HorizontalPanel addpanel1 = new HorizontalPanel(); 
    private HorizontalPanel addpanel2 = new HorizontalPanel(); 
    private final RpctestServiceAsync calNumbers = GWT 
      .create(RpctestService.class); 

    /** 
    * This is the entry point method. 
    */ 
    public void onModuleLoad() { 

     addpanel1.add(label1); 
     addpanel1.add(firstName); 
     addpanel2.add(label2); 
     addpanel2.add(lastName); 
     mainpanel.add(addpanel1); 
     mainpanel.add(addpanel2); 
     mainpanel.add(ans); 

     ans.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 

      String name1 = firstName.getValue();  
      String name2 = lastName.getValue(); 

      calNumbers.addUser(name1,name2, 
       new AsyncCallback<String>() { 
       public void onFailure(Throwable caught) { 
        // Show the RPC error message to the user 
         Window.alert("check your inputs"); 
        } 

       @Override 
       public void onSuccess(String result) { 
       // TODO Auto-generated method stub 
        Window.alert("User is ->"+result); 
       } 
      });} 
     }); 
     // We can add style names to widgets 
     //sendButton.addStyleName("sendButton"); 

     // Add the nameField and sendButton to the RootPanel 
     // Use RootPanel.get() to get the entire body element 

     /*RootPanel.get("nameFieldContainer").add(nameField); 
     * 
     RootPanel.get("sendButtonContainer").add(sendButton); 
     RootPanel.get("errorLabelContainer").add(errorLabel);*/ 
     RootPanel.get().add(mainpanel); 

    } 
} 

接口:

import com.google.gwt.user.client.rpc.RemoteService; 
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; 

@RemoteServiceRelativePath("testService") 
public interface RpctestService extends RemoteService { 

    String addUser(String firstName,String lastName) throws IllegalArgumentException; 
} 


package rpctest.client; 

import com.google.gwt.user.client.rpc.AsyncCallback; 

public interface RpctestServiceAsync { 

    void addUser(String firstName, String lastName, 
      AsyncCallback<String> callback); 

} 

服務實現類:

package rpctest.server; 

import com.google.gwt.user.server.rpc.RemoteServiceServlet; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 
import hibDomain.User; 
import rpctest.client.RpctestService; 

public class RpctestServiceImpl extends RemoteServiceServlet implements RpctestService { 

     public String addUser(String name1, String name2) 
      throws IllegalArgumentException { 

       Transaction trns = null; 
       Session session = HibernateUtil.getSessionFactory().openSession(); 
       try { 
       trns = session.beginTransaction(); 

       User user = new User(); 

       user.setFirstName(name1); 
       user.setLastName(name2); 

       session.save(user); 

       session.getTransaction().commit(); 
       } catch (RuntimeException e) { 
       if(trns != null){ 
       trns.rollback(); 
       } 
       e.printStackTrace(); 
       } finally{ 
       session.flush(); 
       session.close(); 
       } 

      return name1; 
    } 

} 

POJO類:

package hibDomain; 

public class User { 
private Integer id; 
private String firstName; 
private String lastName; 

public Integer getId() { 
    return id; 
} 
public void setId(Integer id) { 
    this.id = id; 
} 
public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
} 

映射文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
<class name="hibDomain.User" table="users" > 
    <id name="id" type="int" column="id" > 
    <generator class="native"/> 
    </id> 

    <property name="firstName"> 
    <column name="first_name" /> 
    </property> 
    <property name="lastName"> 
    <column name="last_name"/> 
    </property> 
</class> 
</hibernate-mapping> 

CFG文件:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <!-- Database connection settings --> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://localhost/userdata</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password"></property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 

    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">thread</property> 

    <!-- Disable the second-level cache --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property> 

    <!-- Drop and re-create the database schema on startup --> 
    <property name="hbm2ddl.auto">update</property> 

    <!-- Mapping files --> 
    <mapping resource="user.hbm.xml"/> 


</session-factory> 
</hibernate-configuration> 

的Util類:

package rpctest.server; 

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtil { 
private static final SessionFactory sessionFactory = buildSessionFactory(); 
private static SessionFactory buildSessionFactory() { 
    try { 
    // Create the SessionFactory from hibernate.cfg.xml 
    return new Configuration().configure().buildSessionFactory(); 
    } 
    catch (Throwable ex) { 
    // Make sure you log the exception, as it might be swallowed 
    System.err.println("Initial SessionFactory creation failed." + ex); 
    throw new ExceptionInInitializerError(ex); 
    } 
} 
public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 
} 
+0

您粘貼的異常僅具有來自Java.io或com.google包(即庫或系統源)的堆棧跟蹤。你可以追加那個指向你寫的一些類的堆棧跟蹤,然後粘貼它的源代碼。這將提供一些線索 –

+0

@enterprize即使沒有明確關閉會話,你是否也會遇到異常? –

+0

@Darthenius:編譯程序時引發異常。 – enterprize

回答

0

你跑出來的磁盤空間。 GWT編譯器找不到臨時空間。

6

這不太可能與磁盤空間不足有關。

更有可能是您構建爲不同的用戶或由於其他原因存在導致問題的現有無效臨時文件。

查看您的GWT目錄中的目錄「gwt-unitCache」和「reports」。刪除它們。然後運行螞蟻清理,螞蟻測試;這應該解決這個問題〜

幾乎可以肯定的是,它'突然開始工作'的原因是你做了一個像新的git克隆或清除目錄,刪除這些文件。 :)

4

刪除./src/main/ gwt-unitCache