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

Java GWT项目在部署时不从RPC加载数据,java,gwt,rpc,Java,Gwt,Rpc,我的GWT项目有点小问题 我有一个带有列表对象L1的类Aclient。单击中的按钮时,服务器端读取文件,并通过RPC返回列表,该列表随后存储在L1中,然后显示在表中。离线时一切都很好。但是,如果我部署应用程序,它似乎不起作用。最奇怪的是:其中1个文件正在工作,我可以在最小的文件表中显示它的数据。如果我按下另一个按钮,从而读取服务器端的另一个文件,那么表上不会显示任何内容。它看起来确实可以读取并存储在L1中,但我不太确定。 在日志文件中,我没有收到任何错误或警告,因此我不明白它为什么不工作。也许它

我的GWT项目有点小问题

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

我从logs only info(仅日志信息)中获得的唯一信息不是警告/错误:此请求导致为应用程序启动新进程,从而导致首次加载应用程序代码。因此,与应用程序的典型请求相比,此请求可能需要更长的时间并使用更多的CPU。当点击按钮时,它会随机出现,否则根本没有任何信息。。。只是一个正在推送的日志,在有信息的日志上延迟非常高,3-7k毫秒,但在没有信息的日志上就可以了。它给我的例子并不存在

这是调用方法的类,而不是完整类:

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>
希望你能帮助我。 提前谢谢


编辑:Code

我会将服务呼叫更改为:

   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);
          }
      });
    }
没有必要检查结果。如果更改后出现错误,请检查接口。不要使用返回类型对象。这将使GWT生成大量不必要的代码


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

如果不发布一些代码,将无法提供帮助。你能发布服务器调用吗?我不知道该发布什么,因为我不知道到底出了什么问题,而且我有很多代码。添加了一些可能有用的东西。我添加了检查结果之后,没有它也无法工作。我还尝试不使用对象作为返回类型,filenotfound异常也不应该解决它,因为:1。它是脱机工作的,所以除非部署没有破坏文件系统,否则它应该是正常的。2.我们还有一个使用相同技术的函数来访问文件,并在那里工作。不过还是要谢谢你的努力。