【问题标题】:GWT Async call always failGWT 异步调用总是失败
【发布时间】:2013-07-11 17:57:18
【问题描述】:

我的 gwt 项目有一些问题,我使用 eclipselink 和 hsqldb 作为数据库。

这是我的代码: 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();
    }   
  }
}

Employee 类存储在 com.example.shared.entity 中;我认为persistence.xml和project.gwt.xml都可以,但是我不确定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"); 而&lt;servlet-class&gt; 派生自存储在服务器端的类,它扩展了 RemoteServiceServlet; &lt;servlet-mapping&gt; 应该和&lt;servlet-name&gt; 一样,而这里,&lt;url-pattern&gt;,我不确定我写了什么。

您建议如何正确运行此代码?提前谢谢!

【问题讨论】:

    标签: java gwt callback


    【解决方案1】:

    在为您的客户端服务异步存根生成代码时,它采用@RemoteServiceRelativePath 注释的值并在其前面加上GWT.getModuleBaseURL() 前缀(这在the javadoc for RemoteServiceRelativePath 中有解释)。

    GWT.getModuleBaseURL() 是您的nocache.js 文件所在的“文件夹”。在 standard 设置中,这直接取决于您的模块名称(project.gwt.xml 和您放入的包)或您在其中的 rename-to 参数。根据错误消息,在您的情况下是http://…/project/(您的nocache.jsproject/project.nocache.js)。

    您必须调整 web.xml 文件中的 &lt;url-pattern&gt; 以匹配该 URL,因此在您的情况下应该是 /project/employeeService

    简单地说:@RemoteServiceRelativePath 配置客户端代码将调用的 URL,&lt;url-pattern&gt; 配置服务“侦听”的 URL;你必须让它们匹配才能让它们互相交谈。

    【讨论】:

    • 如果我将&lt;url-pattern&gt; 设置为/project/employeeService,我会在控制台中看到一个新错误:SEVERE: javax.servlet.ServletContext log: Exception while dispatching incoming RPC call com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract void com.example.client.service.EmployeeService.createemployee()' threw an unexpected exception: javax.persistence.PersistenceException: No persistence providers available for "ronfPU" after trying the following discovered implementations: org.datanucleus.api.jpa.PersistenceProviderImpl。你知道它是什么吗?谢谢
    • 啊,“ronfPU”是&lt;persistence-unit name="ronfPU" transaction-type="RESOURCE_LOCAL"&gt;在persistence.xml中设置的
    • 一次一个错误。您修复了“找不到文件:/project/employeeService”错误,对吗?现在,如果您还有其他问题,请随时提出其他问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多