0

レストサービスまたはjspフォームポストのいずれかからリクエストを受け取ることができるサーブレットがあります。これらは両方とも内部メソッド(internalAddPodcast())を呼び出して、エンティティをデータストアに追加します。

jspページからinternalAddPodcast()を押すと、正常に機能します。追加直後にクエリを実行すると、エンティティが正常に追加されたことがわかります。しかし、残りのメソッドaddPodcast()から実行すると、put()の直後に取得しようとして何も返されないため、datastore.put()は実際にはデータストアに追加されていないようです。コメントを入れたこのクラスの下部近くを見下ろしてください"//このクエリはRESTサービスから追加されたときに空になります:("ここで、いくつかの結果が返されると期待しています。データストア。

    package com.aol.sharepodder;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

@Path("/add/podcast/")
public class AddPodcastServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final Logger log = Logger.getLogger(AddPodcastServlet.class
            .getName());

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {

        String email = req.getParameter("email");
        String collectionName = req.getParameter("collectionName");
        String podcast_url = req.getParameter("podcast_url");
        String podcast_description = req.getParameter("podcast_description");
        String podcast_title = req.getParameter("podcast_title");

        log.info("--post adding " + collectionName);

        internalAddPodcast(email, collectionName, podcast_url,
                podcast_description, podcast_title);

        resp.sendRedirect("/collection_details.jsp?collectionName="
                + collectionName + "&email=" + email);
    }

    @POST
    @Produces("text/plain")
    @Consumes("application/x-www-form-urlencoded")
    public String addPodcast(
            @DefaultValue("barrand@gmail.com") @FormParam("email") String email,
            @DefaultValue("default") @FormParam("collectionName") String collectionName,
            @DefaultValue("") @FormParam("podcast_url") String podcast_url,
            @DefaultValue("") @FormParam("podcast_description") String podcast_description,
            @DefaultValue("") @FormParam("podcast_title") String podcast_title) {
        try {
            internalAddPodcast(email, collectionName, podcast_url,
                    podcast_description, podcast_title);
            if (podcast_url == "") {
                return "No url supplied";
            }
            return "true";
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    private void internalAddPodcast(String email, String collectionName,
            String podcast_url, String podcast_description, String podcast_title) {
        log.info("--INTERNAL ADD ");
        log.info("--email " + email);
        log.info("--collectionName " + collectionName);
        log.info("--podcast_url " + podcast_url);
        log.info("--podcast_description " + podcast_description);
        log.info("--podcast_title " + podcast_title);

        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();

        Entity podcast = new Entity("Podcast");
        podcast.setProperty("collectionName", collectionName);
        podcast.setProperty("user", user);
        podcast.setProperty("email", email);
        Date date = new Date();
        podcast.setProperty("date", date);
        podcast.setProperty("podcast_title", podcast_title);
        podcast.setProperty("podcast_description", podcast_description);
        podcast.setProperty("podcast_url", podcast_url);

        DatastoreService datastore = DatastoreServiceFactory
                .getDatastoreService();
        datastore.put(podcast);

        //try to log the podcast that I just got done adding to the datastore
        Query query = new Query("Podcast");
        PreparedQuery pq = datastore.prepare(query);

            //THIS QUERY IS EMPTY WHEN ADDED FROM THE REST SERVICE :(
        for (Entity p : pq.asIterable()) {
            log.info("_loop " + " - " + KeyFactory.keyToString(p.getKey())
                    + " -- " + p.getProperty("podcast_title") + " - "
                    + p.getProperty("podcast_url"));
        }
    }
}

私が間違っていること、およびrestメソッドから追加しようとしているエンティティがデータストアに追加されない理由についてのアイデア。

どちらの場合も(jsp postまたはrestサービスから)internalAddPodcast()に到達すると、すべてのメソッドパラメーターが正しく入力されていることを私は知っています。

4

2 に答える 2

2

高レプリケーションデータストアは結果整合性があります。つまり、ほとんどのクエリは、挿入したばかりのレコードを返すなど、データストアに加えられたばかりの変更を反映することが保証されていません。これと強一貫性のあるクエリを実行する方法について詳しくは、こちらをご覧ください

于 2012-11-08T16:49:20.510 に答える
1

Ah HA!見つけた。スローされた例外をログに記録していませんでした。基本的に、500文字を超える文字列プロパティを格納しようとしていて、注意が必要な例外がスローされていました:)したがって、datastore.put()に到達することはありませんでした。

于 2012-11-08T16:50:13.213 に答える