1

com.google.apphosting.api.ApiProxy$RequestTooLargeException: API 呼び出し datastore_v3.Put() へのリクエストが大きすぎました。

public static List<Area> readAreas(URL url) {
    List<Area> areas = new ArrayList<Area>();
    try {
        BufferedReader br = new BufferedReader(new FileReader(new File(url.toURI())));
        String row;
        while ((row = br.readLine()) != null) {
            if (row.contains(SEARCHED_ROW)) {
                //get the part after "c"
                String coord[] = (row.split("c"));
                String startCoordM = ((coord[0].trim()).split(" "))[1];
                String curvesCoord= coord[1];

                Area area = new Area();
                area.mPoint= Point.toStartPoint(Point.readPoints(startCoordM));
                area.curves = Curve.readCurves (curvesCoord);
                areas.add(area);
            }
        }
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return areas;
} 

このメソッドはエラーなしで実行されますが、ログアウトして Web アプリケーションの同じページにログインすると、このメソッドは問題なく何度も実行されますが、この例外がスローされます。私はjsf2とprimefaces 3.5でGoogleアプリエンジン1.8.1を使用しています。このメソッドはマネージド Bean から呼び出されます。

public MapMB () {
    eps = EPDAO.getEPList();
    populateAdvancedModel(eps);
    drawPolilines();
}

void drawPolilines() {
    List<Area> areas = Area.readAreas(getFacesContext().getClass().getResource("/map-inksc.svg") );

    for (Area area : areas) {

        List<Curve> curves = area.getCurves();
        Point endPoint = area.getmPoint();

        Polyline polyline = new Polyline();
        polyline.setStrokeWeight(1);  
        polyline.setStrokeColor("#FF0000");  
        polyline.setStrokeOpacity(1);

        for (Curve curve : curves) {
            polyline.getPaths().add( new LatLng(endPoint.getY(),endPoint.getX()) );
            // curve start point is the end point of previous curve (endPoint.getX(),endPoint.getY() )
            double step = 0.01;
            for (double t=0;t<= 1;t=t+step) {
                double x = getCoordFromCurve(endPoint.getX(), endPoint.getX() + curve.getP1().getX(),endPoint.getX() + curve.getP2().getX(),endPoint.getX() + curve.getP3().getX(), t);
                double y = getCoordFromCurve(endPoint.getY(), endPoint.getY() + curve.getP1().getY(),endPoint.getY() + curve.getP2().getY(),endPoint.getY() + curve.getP3().getY(), t);
                polyline.getPaths().add(  new LatLng(y, x) );
            }
            endPoint = new Point (endPoint.getX() + curve.getP3().getX(), endPoint.getY() + curve.getP3().getY());
        }
        advancedModel.addOverlay(polyline);
        polyline = new Polyline();
    }
}

データを読み取らない場合 (上記の readAreas() を使用しない場合)、すべて正常に動作します。では、ファイルからの読み取りがこのエラーにどのように関係しているのでしょうか? 理解できない。

ここに載せていない情報があれば、言ってください。これらのメソッドはすべてエラーなしで実行され、この例外がスローされます

4

1 に答える 1

1

編集を見る

Ok。ということで・・・なんとなく問題解決。どのように?わからない。だから私は持っていた:

a.xhtml  < include b.xhtml 
c.xhtml  < include b.xhtml
a.xhtml and c.xhtml had the same method bFilterMethod()

JSF Bean: a、b、c すべての ViewScoped b には管理プロパティとして a と c がありました。例外がスローされた後、メソッド getsSome() が無限ループのように約20回実行されることをGoogleアプリエンジンのログで見ました。

現在、すべての Bean はリクエスト スコープです

a.xhtml has aFilterMethod that getsSome() data
b.xhtml has bFilterMethod that getsSome() data
and a and b has c as Managed Property 

これが誰かの助けになることを願っていますが、悲しいことに、正確なエラーが何であるかはわかりませんが、明らかにデータベースからの要求が大きすぎることが原因であり、この要求には 3 行しか含まれていません (この要求は何度も呼び出されます)。

編集 何年も経った後、私は誤って自分のトピックに戻ってきました。このすべての本当の理由は、GAE がセッションをデータストアに保存し、jsf ViewScoped Bean が通常の Java アプリケーション サーバーのようにセッションから削除されないことです。したがって、解決策はViewScoped Bean を使用しないことです

于 2013-07-23T12:32:46.200 に答える