16

我正在使用 appengine 云端点并进行对象化。我之前已经部署了这些端点,现在我正在更新它们,但它不适用于 Objectify。我已经搬到一台新机器上并运行最新的 appengine 1.8.6。尝试将 objectify 放在类路径中,但没有奏效。我知道这可以工作,我错过了什么?

运行 endpoints.sh 时:

Error: Parameterized type
   com.googlecode.objectify.Key<MyClass> not supported.

更新:我回到我的旧电脑并在同一个端点上运行 endpoints.sh,它运行良好。老机器有1.8.3。我正在使用物化 3.1。

更新 2:将我的旧机器更新到 1.8.6 并得到与其他机器相同的错误。留下 2 种可能性:1) 端点不再支持 objectify 3.1 2) 端点在最新版本中存在错误

最有可能的#1 ...无论如何我一直想更新到4.0 ...

4

4 回答 4

18

由于 Objectify 的流行,在以前的版本中添加了一种解决方法来支持该Key类型,直到有更通用的解决方案可用。由于新的解决方案可用,解决方法已被删除。您现在可以通过两种方式解决该物业的问题。

  1. 添加一个@ApiResourceProperty注释,该注释会导致在序列化期间从对象中省略该键。如果您想要一个简单的解决方案并且不需要访问客户端中的密钥,请使用此方法。
  2. 添加一个@ApiTransformer注释,该注释提供了一种兼容的机制来序列化/反序列化该字段。如果需要访问客户端中的密钥(或其表示),请使用此方法。由于这需要编写一个转换器类,所以它比第一个选项工作更多。
于 2013-10-31T21:08:51.373 回答
6

I came up with the following solution for my project:

@Entity
public class Car {

    @Id Long id;

    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
    Key<Driver> driver;

    public Key<Driver> getDriver() {
        return driver;
    }

    public void setDriver(Key<Driver> driver) {
        this.driver = driver;
    }

    public Long getDriverId() {
        return driver == null ? null : driver.getId();
    }

    public void setDriverId(Long driverId) {
        driver = Key.create(Driver.class, driverId);
    }
}

@Entity
public class Driver {
    @Id Long id;
}

I know, it's a little bit boilerplate, but hey - it works and adds some handy shortcut methods.

于 2014-09-27T10:38:43.807 回答
0

其他人已经提到如何使用@ApiResourcePropertyand来解决这个问题@ApiTransformer。但我确实需要客户端可用的密钥,我不想为每个人转换整个实体。我尝试将 Objectify Key 替换为com.google.appengine.api.datastore.Key,它看起来在我的情况下也可以正常工作,因为这里的问题主要是由于该端点不支持参数化类型。

于 2016-03-10T05:45:59.380 回答
0

起初,我不明白 Flori 给出的答案,以及它到底有多大用处。因为其他人可能会受益,所以我将做一个简短的解释。

如前所述,您可以使用@ApiTransformer为您的类定义一个转换器。这会将不可序列化的字段(例如 type 字段)Key<myClass>转换为其他内容,例如Long.

事实证明,当 GCE 处理一个类时,会调用方法get{fieldName}set{FieldName}自动用于转换字段{fieldName}。我无法在 Google 文档中的任何地方找到它。

这是我在课堂上使用它的Key{Machine}方式Exercise

public class Exercise {
  @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
  public Key<Machine> machine;
  // ... more properties

  public Long getMachineId() {
    return this.machine.getId();
  }

  public void setMachineId(Long machineId) {
    this.machine = new Key<Machine>(Machine.class, machineId);
  }

  // ...
}
于 2015-08-23T16:28:07.723 回答