尚未创建Google应用引擎实体

时间:2016-05-31 08:03:19

标签: java android google-app-engine google-cloud-datastore objectify

我正在使用谷歌端点和谷歌应用引擎开发一个Android应用程序。我的后端似乎没有做任何事情。看起来似乎没有任何东西被保存到数据存储区,因此无法从中检索任何内容。

以下是我在端点中编写的一些 Api方法

private static String getUserId(User user) {
        String userId = user.getUserId();
        if (userId == null) {
            AppEngineUser appEngineUser = new AppEngineUser(user);
            ofy().save().entity(appEngineUser).now();
            // Begin new session for not using session cache.
            Objectify objectify = ofy().factory().begin();
            AppEngineUser savedUser = objectify.load().key(appEngineUser.getKey()).now();
            userId = savedUser.getUser().getUserId();
        }
        return userId;
    }

    @ApiMethod(name = "saveProfile", path = "profile", httpMethod = ApiMethod.HttpMethod.POST)
    public Profile saveProfile(final User user, final ProfileForm profileForm) throws UnauthorizedException {
        if(user == null) {
            throw new UnauthorizedException("Authorization required.");
        }

        String firstName = profileForm.getFirstName();
        String surname = profileForm.getLastName();
        String userEmail = user.getEmail();
        int year = profileForm.getYear();
        int month = profileForm.getMonth();
        int day = profileForm.getDay();

        Profile profile = ofy().load().key(Key.create(Profile.class, getUserId(user))).now();

        if (profile == null) {
            // the user does not have a profile and is creating one for the first time
            profile = new Profile(getUserId(user), firstName, surname, userEmail, year, month, day);
        } else {
            profile.update(firstName, surname, userEmail, year, month, day);
        }
        ofy().save().entity(profile).now();
        return profile;
    }

    @ApiMethod(name = "getProfile", path = "profile", httpMethod = ApiMethod.HttpMethod.GET)
    public Profile getProfile(User user) throws UnauthorizedException {
        if (user == null) {
            throw new UnauthorizedException("Authentication required.");
        }
        return ofy().load().key(Key.create(Profile.class, getUserId(user))).now();
    }
}

配置文件类具有@Entity注释,并在静态块中以objectify注册​​,如下所示:

static {
        factory().register(AppEngineUser.class);
        factory().register(Profile.class);
}

userId由GAE通过

生成
com.google.appengine.api.users.User

,userId属性是带有@Index注释的String。

我也对api explorer以及它如何响应这些方法感到困惑。每当我调用saveProfile api方法时,都会返回一个userId 0"example@example.com"的电子邮件的配置文件对象,但我相信这是在localhost上运行时的默认电子邮件。

我也在通过HTTP运行api explorer,谷歌称这“可能会导致问题。”这就是为什么没有任何工作的原因。我不得不加载不安全的脚本只是为了我使用我的api,但也许它不起作用,因为它是通过HTTP托管而不是HTTPS。

由于我对GAE的理解存在根本缺陷,或者由于我在localhost上运行,这整个问题是无法完全测试我的方法。如果是后者,也许我应该部署到Appspot,事情可能会更顺畅。

如果还有其他需要帮助的地方,请问问。

谢谢!

1 个答案:

答案 0 :(得分:1)

在开发者控制台中检查日志。它记录您执行的所有API方法,并显示是否有任何错误。

由于您将example@example.com作为用户的电子邮件,这使我相信用户未被GAE注入。这可能是因为您在做错了客户端(例如在Android中)。确保您的Android应用正确要求将用户登录Google并将这些凭据传递给Android中的构建器对象。

如果您通过api资源管理器执行API方法,则需要首先以Google用户身份登录,以便在您的方法中填充该用户对象(我想您已经知道了)。

简而言之,请检查您的日志和客户端代码。