503错误ObjectifyService NoSuchFieldError:WHITESPACE

时间:2017-05-26 03:12:55

标签: java google-app-engine intellij-idea google-cloud-datastore google-cloud-endpoints

更新

如果我删除了个人资料pojo上的@Cache注释,它适用于开发环境。

ORIGINAL

我的问题是,当我尝试使用objectify从de userId创建密钥时,在使用intellij的GAE开发服务器中出现此错误

关于api资源管理器

503 Service Unavailable

{
 "error": {
  "message": "java.lang.NoSuchFieldError: WHITESPACE",
  "code": 503,
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "java.lang.NoSuchFieldError: WHITESPACE"
   }
  ]
 }
}

Java例外

java.lang.NoSuchFieldError: WHITESPACE
    at com.google.appengine.api.datastore.KeyFactory.stringToKey(KeyFactory.java:194)
    at com.googlecode.objectify.cache.KeyMemcacheService.keyify(KeyMemcacheService.java:46)
    at com.googlecode.objectify.cache.KeyMemcacheService.getIdentifiables(KeyMemcacheService.java:76)
    at com.googlecode.objectify.cache.EntityMemcache.getAll(EntityMemcache.java:245)
    at com.googlecode.objectify.cache.CachingAsyncDatastoreService.get(CachingAsyncDatastoreService.java:252)
    at com.googlecode.objectify.impl.LoadEngine.fetch(LoadEngine.java:168)
    at com.googlecode.objectify.impl.Round.fetchPending(Round.java:168)
    at com.googlecode.objectify.impl.Round.execute(Round.java:137)
    at com.googlecode.objectify.impl.LoadEngine.execute(LoadEngine.java:89)
    at com.googlecode.objectify.impl.Round$1.nowUncached(Round.java:70)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
    at com.googlecode.objectify.LoadResult.now(LoadResult.java:25)

此外,在app引擎上部署我没有任何问题,它只是工作正常。我试过chrome和firefox。

我的代码就像这样

OfyService.java

static {
        try {
            factory().register(Profile.class);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public static Objectify ofy() {
        return ObjectifyService.ofy();
    }


    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }
}

Profile.java

@Entity
@Cache
public class Profile {
    String userName;
    String displayName;
    String mainEmail;

    @Id String userId;

    public Profile(String userId, String userName, String displayName, String mainEmail) {
        this.userId = userId;
        this.userName = userName;
        this.displayName = displayName;
        this.mainEmail = mainEmail;
    }

    public String getUserName() {
        return userName;
    }

    public String getDisplayName() {
        return displayName;
    }

    public String getMainEmail() {
        return mainEmail;
    }

    public String getUserId() {
        return userId;
    }

    private Profile() {
    }

    public void update(String userName, String displayName, String mainEmail) {
        if (userName != null) {
            this.userName = userName;
        }
        if (displayName != null) {
            this.displayName = displayName;
        }
        if (mainEmail != null) {
            this.mainEmail = mainEmail;
        }
    }

    public void updateName(String displayName) {
        if (displayName != null) {
            this.displayName = displayName;
        }
    }
}

MyApi.java

//region Profile
    @ApiMethod(name = "saveProfile", path = "profile", httpMethod = ApiMethod.HttpMethod.POST)
    public Profile saveProfile(final User user, ProfileForm profileForm)
            throws UnauthorizedException {
        if (user == null) {
            throw new UnauthorizedException("Authorization required");
        }
        String mainEmail = user.getEmail();
        String userId = user.getUserId();
        String displayName = profileForm.getDisplayName();

        Key<Profile> profileKey = Key.create(Profile.class, userId);
        Profile profile = ofy().load().key(profileKey).now();

        String userName = extractDefaultDisplayNameFromEmail(mainEmail);
        if (profile == null) {
        ...

此行

Profile profile = ofy().load().key(profileKey).now();

我正在使用此版本(并尝试使用其他版本):

  • 应用服务引擎的API-1.0-SDK:53年9月1日
  • 应用服务引擎的端点:53年9月1日
  • 番石榴:22.0-机器人
  • 客观化:5.1.16

以及其他版本:

  • jdk:1.8.0_121
  • intellij 2017.1.3
  • Google Cloud SDK 156.0.0
    • app-engine-java 1.9.53
    • app-engine-python 1.9.53
    • bq 2.0.24
    • cloud-datastore-emulator 1.2.1
    • 核心2017.05.19
    • gcloud
    • gsutil 4.26

1 个答案:

答案 0 :(得分:0)

如果应用程序试图访问或修改对象的指定字段,并且该对象不再具有该字段或者也已更改(通常部分编译或其他依赖项目中的相同类),则抛出此error 。 尝试在更改之前识别出该字段来自所有类的所有类并更新所有项目,并且即使通常现代IDE将为您执行此操作,简单的清理和构建也将起到作用。