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 加载数据的主要内容,如果未能解决你的问题,请参考以下文章
将带有 RPC 的 GWT 部署到 tomcat 的问题(可能是 web.xml 问题)