Конечные точки конечных пользователей Google App Engine userId равны нулю

Я использую (немного измененный) обходной путь из этого курса , чтобы получить userId, который является нулевым, если запрос был отправлен от клиента Android.

/** * This is an ugly workaround for null userId for Android clients. * * @param user A User object injected by the cloud endpoints. * @return the App Engine userId for the user. */ private static String getUserId(User user) { String userId = user.getUserId(); if (userId == null) { LOG.info("userId is null, so trying to obtain it from the datastore."); AppEngineUser appEngineUser = new AppEngineUser(user); ofy().save().entity(appEngineUser).now(); AppEngineUser savedUser = ofy().load().key(appEngineUser.getKey()).now(); userId = savedUser.getUser().getUserId(); LOG.info("Obtained the userId: " + userId); } return userId; } 

Хотя я не могу получить userId.

 INFO: Obtained the userId: null 

Это обходное решение уже отлично работает в других проектах, поэтому проблема должна быть в другом месте. Мои конечные точки api аннотируются следующими областями: clientIds и аудиториями:

 scopes = { Constants.EMAIL_SCOPE }, clientIds = { Constants.API_EXPLORER_CLIENT_ID, Constants.WEB_CLIENT_ID, Constants.ANDROID_CLIENT_ID }, audiences = { Constants.ANDROID_AUDIENCE } 

Constants.ANDROID_AUDIENCE и Constants.WEB_CLIENT_ID одинаковы. Я не пользуюсь веб-клиентом, но Google сказал мне добавить идентификатор веб-клиента. Должен ли этот идентификатор клиента перенаправлять uris и исходные данные javascript?

В моем Android-клиенте я использую следующее, чтобы указать аудиторию.

 mCredential = GoogleAccountCredential.usingAudience( EndpointService.this, "server:client_id:IDIDIDID.apps.googleusercontent.com" ); 

Пожалуйста, помогите мне разобраться в этом.

Solutions Collecting From Web of "Конечные точки конечных пользователей Google App Engine userId равны нулю"

Я просто понял, почему это обходное решение работает. Мне нужно начать новый сеанс объектизации, чтобы кеш не использовался, и пользовательский идентификатор может быть заполнен.

 Objectify objectify = ofy().factory().begin(); AppEngineUser savedUser = objectify.load();