1

私の目標は、GWT アプリのサーブレット内からサーバー上にある csv ファイルを試して読み取ることです。

私は最初にこのアプローチを試みました

public String[] convertFileToStringArrays(String pathToCSV) 
{
    BufferedReader br = null;
    try 
    {
        br = new BufferedReader(new FileReader(pathToCSV));
    } 
    catch (FileNotFoundException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String currLine;
    String [] string_arrays = null;
    int i = 0;
    try {
        while ((currLine = br.readLine()) != null )
        {
            System.out.println(currLine);
            string_arrays[i] = currLine;
            i++;
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return string_arrays;
}

ただし、Java IO タイプの例外が発生していました。GWTアプリはJava IOライブラリにアクセスできないため、上記の方法を使用できないことがわかりました。そこで、ググってみたところ、サーバー上の GWT アプリでファイルを読み取る方法は Request Builder を使用することだと人々が言っ​​ていることがわかりました。そこで、ウェブで見たいくつかのサンプルを使用して、次のアプローチを試みました。この作品では、ファイルはローカル ファイル システムにあり、PathToCSV 変数を介してパスを渡しています。

public String[] convertFileToStringArrays(final String pathToCSV)
{
     RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, pathToCSV);
     try
     {
         rb.sendRequest(null, new RequestCallback()
         {
            @Override
            public void onError(Request request, Throwable exception) 
            {
                System.out.println("Failed to load file:"+ pathToCSV);

            }

            @Override
            public void onResponseReceived(Request request,Response response) 
            {
                //TO DO currently just using this until the method is functional and can retrieve the file
                String resp = response.getText();

            }

         });
     }
     catch (Exception e)
     {
         System.out.println(e.getMessage());

     }

    return null;



}

}

ただし、このコードは別の例外をスローしています。

例外スタック トレース:

Jun 26, 2012 7:29:41 AM com.google.appengine.tools.development.ApiProxyLocalImpl log

SEVERE: javax.servlet.ServletContext ログ: 着信 RPC 呼び出しのディスパッチ中に例外が発生しました.lang.String)' が予期しない例外をスローしました: java.lang.UnsatisfiedLinkError: com.google.gwt.xhr.client.XMLHttpRequest.create()Lcom/google/gwt/xhr/client/XMLHttpRequest; com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385) で com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588) で com.google .gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) com.google.gwt.user で.server.rpc. jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)原因: java.lang.UnsatisfiedLinkError: com.google.gwt.xhr.client.XMLHttpRequest.create()Lcom/google/gwt/xhr/client/XMLHttpRequest; com.google.gwt.xhr.client.XMLHttpRequest.create(ネイティブ メソッド) com.google.gwt.http.client.RequestBuilder.doSend(RequestBuilder.java:369) com.google.gwt.http.client. RequestBuilder.sendRequest(RequestBuilder.java:256) at cs310.server.CsvFileParserServiceImpl.convertFileToStringArrays(CsvFileParserServiceImpl.java:60) sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:

このコードを使用してcsvファイルをアプリに読み込むことが正しい軌道に乗っているかどうかを誰かが理解するのを手伝ってくれるかどうか疑問に思っていましたか? もしそうなら、この例外を解決するにはどうすればよいですか。そうでない場合、同じことを行うコードのサンプルはありますか?


追加 URL接続方法を試した後の新しいコード

public String[] convertFileToStringArrays(final String pathToCSV)
{
    String [] string_arrays = null;
     try {
            URL url = new URL(pathToCSV);
            BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
            String currLine;

            int i = 0;
            while ((currLine = br.readLine()) != null )
                {
                    System.out.println(currLine);
                    string_arrays[i] = currLine;
                    i++;
                }
            br.close();

        } 
catch (MalformedURLException e) {
            // ...
        } catch (IOException e) {
            // ...
        }
    if(string_arrays == null)
        System.out.println("CsvFilePasrserServiceImpl says that string_arrays is null");
        return string_arrays;

}

これにより、次のスタック トレースが生成されます。

SEVERE: javax.servlet.ServletContext log: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String[]     cs310.client.CsvFileParserService.convertFileToStringArrays(java.lang.String)' threw an     unexpected exception: java.security.AccessControlException: access denied     (java.io.FilePermission /Users/AM/Sites/new_food_vendor_locations2.csv read)
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588)
at     com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at     com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at    com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
at   org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at   com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at    com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:369)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.security.AccessControlException: access denied (java.io.FilePermission /Users/AM/Sites/new_food_vendor_locations2.csv read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:252)
at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
at java.io.File.isDirectory(File.java:752)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:65)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
at java.net.URL.openStream(URL.java:1010)
at cs310.server.CsvFileParserServiceImpl.convertFileToStringArrays(CsvFileParserServiceImpl.java:99)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
... 34 more
4

1 に答える 1

2

あなたが抱えていた問題java.ioは GWT が原因ではなく、AppEngineが原因でした。RequestBuilderGWT はクライアント側であるため、サーバー側で使用しようとすると失敗するようになりました。

AppEngine のサーバー側から URL をフェッチするには、URL フェッチ サービスを使用します。

于 2012-06-26T15:23:33.570 に答える