2013-07-10 122 views
0

我的gwt項目有一些問題,我使用eclipselink和hsqldb作爲數據庫。GWT異步調用總是失敗

這裏是我的代碼: Project.java:

package com.example.client; 
public class Project implements EntryPoint { 

private final EmployeeServiceAsync eService = (EmployeeServiceAsync) GWT.create(EmployeeService.class); 

[...] some GWT code 


@Override 
public void onModuleLoad() { 

     eService.createemployee(new AsyncCallback<Void>() { 
      @Override 
      public void onFailure(Throwable caught) { 
       Window.alert("Fail!"); 
      } 
      @Override 
      public void onSuccess(Void result) { 
      //nothing 
      } 
     }); 

但它失敗每次有這樣的警告:

WARNING: No file found for: /project/employeeService 

所以,我怎麼能正確調用此方法?

EmployeeService.java

package com.example.client.service; 
@RemoteServiceRelativePath("employeeService") 
public interface EmployeeService extends RemoteService{ 

public void createemployee(); 
} 

EmployeeServiceAsync.java

package com.example.client.service; 
public interface EmployeeServiceAsync { 

void createemployee(AsyncCallback<Void> callback); 
} 

EmployeeServiceImpl

package com.example.server.ServiceImpl; 
public class EmployeeServiceImpl extends RemoteServiceServlet implements EmployeeService { 

private static final long serialVersionUID = 1L; 

public void createemployee() { 

    javax.persistence.EntityManagerFactory emf = Persistence.createEntityManagerFactory("ronfPU"); 
    javax.persistence.EntityManager em = emf.createEntityManager(); 


    try { 
// Create new Employee 
    em.getTransaction().begin(); 
    Employee e1 = new Employee(); 
    e1.setName("admin"); 
    e1.setSurname("admin"); 
    e1.setUsername("admin"); 
    e1.setPassword("admin"); 
    em.persist(a1); 
    em.getTransaction().commit(); 
     } finally { 
    em.close(); 
    } 
    } 
} 

員工類存儲在com.example.shared.entity中;我認爲的persistence.xml和project.gwt.xml都OK,但我不知道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>employeeServiceImpl</servlet-name> 
<servlet-class> 
    com.example.server.ServiceImpl.EmployeeServiceImpl 
</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>employeeServiceImpl</servlet-name> 
</servlet-mapping> 

<!-- Default page to serve --> 
<welcome-file-list> 
<welcome-file>Project.html</welcome-file> 
<url-pattern>/com.example.client.Project/employeeService</url-pattern> 
</welcome-file-list> 

</web-app> 

首先應該是,如果我理解正確的話,從@RemoteServiceRelativePath("employeeService")派生; 而<servlet-class>派生自存儲在服務器端的類,它擴展了RemoteServiceServlet; <servlet-mapping>應該是<servlet-name>,在這裏,在<url-pattern>,我不知道我寫了什麼。

您如何建議正確運行此代碼?先謝謝你!

回答

1

當生成用於您的客戶端服務異步存根的代碼,它將採用@RemoteServiceRelativePath註釋的值和與所述前綴GWT.getModuleBaseURL()它(這在the javadoc for RemoteServiceRelativePath解釋)。

GWT.getModuleBaseURL()是您的nocache.js文件所在的「文件夾」。在標準設置中,這直接取決於您的模塊名稱(project.gwt.xml及其包裝)或rename-to參數。根據錯誤信息,您的情況爲http://…/project/(您的nocache.jsproject/project.nocache.js)。

您必須調整web.xml文件中的<url-pattern>以匹配該URL,因此您的情況應該是/project/employeeService

簡單地說:使用@RemoteServiceRelativePath您可以配置客戶端代碼將調用哪個URL,並使用<url-pattern>配置服務「偵聽」的URL;你必須讓它們匹配才能讓它們相互交談。

+0

如果我將''設置爲'/ project/employeeService'我在控制檯中看到一個新錯誤:'SEVERE:javax.servlet.ServletContext log:分派傳入RPC調用時的異常 com.google.gwt.user.server .rpc。UnexpectedException:Service方法'public abstract void com.example.client.service.EmployeeService.createemployee()'拋出一個意外的異常:javax.persistence.PersistenceException:在嘗試以下發現的實現之後,沒有可用於「ronfPU」的持久性提供程序:org。 datanucleus.api.jpa.PersistenceProviderImpl'。你有什麼想法是什麼?謝謝 – Ciotto

+0

啊,「ronfPU」是設置在persistence.xml中的 Ciotto

+0

一次發生一個錯誤。您修正了「找不到:/ project/employeeService」錯誤的文件,對嗎?現在,如果您有其他問題,請隨時提出另一個問題。 –