GWT 项目在部署时不会从 RPC 加载数据

Posted

技术标签:

【中文标题】GWT 项目在部署时不会从 RPC 加载数据【英文标题】:GWT Project doesn't load data from RPC when deployed 【发布时间】:2013-12-15 15:01:02 【问题描述】:

我的 GWT 项目有点问题。

我有一个带有列表对象 L1 的 A 类(客户端)。当单击 A 中的按钮时,服务器端正在读取文件,并通过 RPC 返回一个列表,然后将其存储在 L1 中,然后显示在表格中。离线时一切正常。但是,如果我部署该应用程序,它似乎不起作用。最奇怪的是:1 个文件正在工作,我可以在表中显示它的数据(最小的文件)。如果我按下另一个按钮(从而读取服务器端的另一个文件),表格上不会显示任何内容。它似乎确实在 A 上的 L1 中读取并存储它,但我不太确定。 在日志文件中,我没有收到任何错误或警告,所以我不明白为什么它不起作用。也许它运行得不够快或其他什么?

我从日志中获得的唯一信息(只有信息而不是警告/错误):“此请求导致为您的应用程序启动一个新进程,从而导致您的应用程序代码首次加载。因此,与您的应用程序的典型请求相比,此请求可能需要更长的时间并使用更多的 CPU。”单击按钮时它会随机出现(否则根本没有任何信息......只是一个被推送的日志),并且带有信息(3-7k ms)的日志上的延迟非常高,但在那些没有信息的。它给我的实例不存在。

这是调用方法的类(不是完整类):

public class DatasetMenu
    private DataImportServiceClientImpl importer;
    public void historyChangeState(String Abstimmung)
        importer.readInput(Abstimmung);
    

这是客户端代码:

public class DataImportServiceClientImpl
    private DataImportServiceAsync service;
    public DatasetMenu menu;
    public DataImportServiceClientImpl(String url)
        this.service = GWT.create(DataImportService.class);
        ServiceDefTarget endpoint = (ServiceDefTarget) this.service;
        endpoint.setServiceEntryPoint(url);

        this.menu=new DatasetMenu(this);
    
    public void readInput(String Abstimmung)
        this.service.readInput(Abstimmung, new DefaultCallback());
    
    private class DefaultCallback implements AsyncCallback 

        @Override
        public void onFailure(Throwable caught) 
            System.out.println("An Error has occured!");
        

        @Override
        public void onSuccess(Object result) 
            if(result instanceof List<?>)
            List<List<Raumeinheit>> temp = (List<List<Raumeinheit>>) result;
            menu.setData(temp);
            
        

    


这是服务器端的代码:

public class DataImportServiceImpl extends RemoteServiceServlet implements DataImportService

    @Override
    public List<List<Raumeinheit>> readInput(String Abstimmung)
        List<String> fileList=new ArrayList<String>();
        fileList.add("files/" + Abstimmung + ".b.csv");
        fileList.add("files/" + Abstimmung + ".k.csv");
        System.out.println(fileList.get(0));
        List<List <String[]> > total2 = new ArrayList<List <String[]> >();
        String[] values;
        for(int i =0;i<fileList.size();i++)
        List<String[]> total = new ArrayList<String[]>();
        File file = new File(fileList.get(i));
        try
            Scanner inputStream = new Scanner(file);
            while(inputStream.hasNext())
                String data = inputStream.nextLine();
                values = data.split(";");
                total.add(values);
            
            inputStream.close();
        catch(FileNotFoundException e)
            e.printStackTrace();
        
        total2.add(total);
        
        List< List<Raumeinheit> > result = new ArrayList<List<Raumeinheit>>();
        for(int i = 0;i<total2.size();i++)
            List<Raumeinheit> temp = new ArrayList<Raumeinheit>();
            for(int j=0;j<total2.get(i).size();j++)
                if(i==1)
                temp.add(new Raumeinheit(total2.get(i).get(j)[0],Integer.parseInt(total2.get(i).get(j)[1]),Integer.parseInt(total2.get(i).get(j)[2]),Integer.parseInt(total2.get(i).get(j)[3]),Double.parseDouble(total2.get(i).get(j)[4]), Double.parseDouble(total2.get(i).get(j)[5]), Double.parseDouble(total2.get(i).get(j)[6])));
                
                else
                temp.add(new Raumeinheit(Integer.parseInt(total2.get(i).get(j)[0]),total2.get(i).get(j)[1],Integer.parseInt(total2.get(i).get(j)[2]),Integer.parseInt(total2.get(i).get(j)[3]),Integer.parseInt(total2.get(i).get(j)[4]),Double.parseDouble(total2.get(i).get(j)[5]), Double.parseDouble(total2.get(i).get(j)[6]), Double.parseDouble(total2.get(i).get(j)[7])));
                
            
            result.add(temp);
        
        return result;
    

正如我所说,它可以完全离线工作,所以不必担心服务器端代码。在线它仅适用于我们拥有的 8 个文件中的 1 个。

servlet:

  <servlet>
    <servlet-name>DataImportServlet</servlet-name>
    <servlet-class>com.se.sprint1.server.DataImportServiceImpl</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>DataImportServlet</servlet-name>
    <url-pattern>/sprint1/DataImport</url-pattern>
  </servlet-mapping>

希望你能帮助我。 提前致谢

编辑:代码

【问题讨论】:

如果不发布一些代码,将无法提供帮助。你能发布服务器调用吗? 我不确定要发布什么,因为我不知道到底出了什么问题,而且我有很多代码。添加了一些可能有用的东西。 【参考方案1】:

我会将服务调用更改为:

   public void readInput(String Abstimmung)
      this.service.readInput(Abstimmung, new AsyncCallback<List<List<Raumeinheit>>()
          @Override
          public void onFailure(Throwable caught) 
              System.out.println("An Error has occured!");
              // show an error message
              Window.alert("An error has occured!!"); 
          

          @Override
          public void onSuccess(List<List<Raumeinheit>> result) 
              menu.setData(result);
          
      );
    

无需检查结果。如果您在此更改后遇到错误,请检查接口。不要使用返回类型 Object。这会让 GWT 生成很多不必要的代码。

另外,我会更改:如果服务器出现问题,则抛出异常。在服务器上出现异常的情况下,您打印一个异常并且代码继续运行,就好像什么也没发生一样。这可能是你的问题。如果您收到FileNotFoundException,则抛出异常并在客户端进行处理。

【讨论】:

我后来添加了结果检查(没有它也无法工作)。我还尝试不使用对象作为返回类型,并且 filenotfound 异常也不应该解决它,因为: 1. 它离线工作,所以除非部署不会弄乱“文件系统”,否则应该没问题。 2. 我们还有一个具有相同技术的功能来访问文件并在那里工作。但无论如何感谢您的努力。

以上是关于GWT 项目在部署时不会从 RPC 加载数据的主要内容,如果未能解决你的问题,请参考以下文章

尝试从GWT-RPC项目获取的Tomcat 7上的部署战争

如何使用 GWT 将许多数据从数据存储区显示到网站

GWT RPC 测试数据库连接

将带有 RPC 的 GWT 部署到 tomcat 的问题(可能是 web.xml 问题)

尝试在来自 GWT-RPC 项目的 Tomcat 7 上部署战争

调用 RPC 时出错 - GWT,404 服务器响应状态为 404(未找到)