Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 使用云端点进行对象化_Google App Engine_Google Cloud Endpoints_Objectify - Fatal编程技术网

Google app engine 使用云端点进行对象化

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. 错误:参数化类型 不

我正在使用appengine云端点和objectify。我以前部署过这些端点,现在我正在更新它们,它不使用Objectify。我换了一台新机器,运行最新的appengine 1.8.6。尝试将objectify放在类路径中,但没有成功。我知道这是可行的,我错过了什么

运行endpoints.sh时:

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的流行,在以前的版本中添加了一个变通方法来支持
类型,直到有了更通用的解决方案。由于新的解决方案可用,解决方案已被删除。现在有两种方法可以解决该属性的问题

  • 添加一个注释,该注释导致在序列化过程中从对象中省略键。如果您想要一个简单的解决方案,并且不需要访问客户端中的密钥,请使用此方法
  • 添加一个注释,该注释提供一个兼容的机制来序列化/反序列化字段。如果需要访问客户端中的密钥(或密钥的表示形式),请使用此方法。因为这需要编写一个transformer类,所以它比第一个选项要复杂得多

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

    @实体
    公车{
    @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移动到该字段以节省一些混乱