使用云端点进行客观化

Pat*_*ick 16 google-app-engine objectify google-cloud-endpoints

我正在使用appengine云端点和客观化.我之前已经部署了这些端点,现在我正在更新它们,它不能与Objectify一起使用.我已经搬到了新机器并运行最新的appengine 1.8.6.尝试将objectify放在classpath中并且不起作用.我知道这可以工作,我错过了什么?

运行endpoints.sh时:

Error: Parameterized type
   com.googlecode.objectify.Key<MyClass> not supported.
Run Code Online (Sandbox Code Playgroud)

更新:我回到我的旧计算机并在同一端点上运行endpoints.sh并且工作正常.旧机器有1.8.3.我正在使用客观化3.1.

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

最有可能#1 ...我一直想要更新到4.0 ...

Dan*_*oet 18

由于Objectify的流行,在先前版本中添加了一种解决方法来支持该Key类型,直到有更通用的解决方案可用.由于新解决方案可用,因此已删除了解决方法.现在有两种方法可以解决该属性的问题.

  1. 添加@ApiResourceProperty注释,使序列化期间从对象中省略键.如果您想要一个简单的解决方案而不需要访问客户端中的密钥,请使用此方法.
  2. 添加@ApiTransformer注释,该注释提供用于序列化/反序列化字段的兼容机制.如果需要访问客户端中的密钥(或其表示),请使用此方法.由于这需要编写变换器类,因此它比第一个选项更有效.


Flo*_*ori 6

我为我的项目想出了以下解决方案:

@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;
}
Run Code Online (Sandbox Code Playgroud)

我知道,它有点样板,但是嘿 - 它的工作原理并添加了一些方便的快捷方法.