Google app engine 使用云端点进行对象化
我正在使用appengine云端点和objectify。我以前部署过这些端点,现在我正在更新它们,它不使用Objectify。我换了一台新机器,运行最新的appengine 1.8.6。尝试将objectify放在类路径中,但没有成功。我知道这是可行的,我错过了什么 运行endpoints.sh时:Google app engine 使用云端点进行对象化,google-app-engine,google-cloud-endpoints,objectify,Google App Engine,Google Cloud Endpoints,Objectify,我正在使用appengine云端点和objectify。我以前部署过这些端点,现在我正在更新它们,它不使用Objectify。我换了一台新机器,运行最新的appengine 1.8.6。尝试将objectify放在类路径中,但没有成功。我知道这是可行的,我错过了什么 运行endpoints.sh时: Error: Parameterized type com.googlecode.objectify.Key<MyClass> not supported. 错误:参数化类型 不
Error: Parameterized type
com.googlecode.objectify.Key<MyClass> not supported.
错误:参数化类型
不支持com.googlecode.objectify.Key。
更新:
我回到我的旧电脑上,在同一个端点上运行endpoints.sh,它运行得很好。旧机器有1.8.3。我使用的是objectify 3.1
更新2:
将我的旧计算机更新为1.8.6,并得到与其他计算机相同的错误。留下两种可能性:
1) 端点不再支持objectify 3.1
或
2) 端点在最新版本中有一个bug
最有可能的是#1…我一直想升级到4.0…由于Objectify的流行,在以前的版本中添加了一个变通方法来支持
键
类型,直到有了更通用的解决方案。由于新的解决方案可用,解决方案已被删除。现在有两种方法可以解决该属性的问题
我为我的项目提出了以下解决方案:
@实体
公车{
@Id长Id;
@ApiResourceProperty(忽略=AnnotationBoolean.TRUE)
关键驱动程序;
公钥getDriver(){
返回驱动器;
}
公共无效设置驱动程序(密钥驱动程序){
this.driver=driver;
}
公共长getDriverId(){
返回驱动程序==null?null:driver.getId();
}
public void setDriverId(长driverId){
driver=Key.create(driver.class,driverId);
}
}
@实体
公务舱司机{
@Id长Id;
}
我知道,这有点像样板,但嘿,它很有效,并添加了一些方便的快捷方式。起初,我不理解Flori给出的答案,以及它到底有多有用。因为其他人可能会受益,所以我将给出一个简短的解释 如前所述,您可以使用
@ApiTransformer
为类定义一个转换器。这将把一个不可变量字段(如Key
类型的字段)转换为另一个字段(如Long
)
事实证明,当GCE处理一个类时,名为get{fieldName}
和set{fieldName}
的方法会自动用于转换字段{fieldName}
。我在谷歌的文档中找不到这个
下面是我如何在我的练习
类中将它用于键{Machine}
属性:
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);
}
// ...
}
公开课练习{
@ApiResourceProperty(忽略=AnnotationBoolean.TRUE)
公钥机;
//…更多的财产
公共长getMachineId(){
返回此.machine.getId();
}
公共无效setMachineId(长machineId){
this.machine=新密钥(machine.class,machineId);
}
// ...
}
其他人已经提到了如何使用@ApiResourceProperty
和@ApiTransformer
实现这一点。但我确实需要客户端中可用的密钥,我不想为每个密钥转换整个实体。我尝试用com.google.appengine.api.datastore.Key
替换Objectify键,在我的例子中,它似乎也运行得很好,因为这里的问题主要是因为该端点不支持参数化类型。Hi Dan,无关,我偶然发现了关于google Cloud端点限制的问题,我想知道它们是否仍然存在,答案是好的@Sti您的意思是为Objectify键添加显式处理程序吗?我不这么认为。通用解决方案解决了Objectify和其他任何情况。我们需要在iOS端点中访问对象的ID。您的第一个解决方案完全忽略此字段。就我们所见,第二种解决方案转换整个对象,而不仅仅是您所说的“字段”。有没有办法只转换键
属性,以便端点可以访问它?你能谈谈这两种解决方案的优缺点吗?@clocksmith我在上面加了几句话。PTALYou可以将@ApiResourceProperty移动到该字段以节省一些混乱