2013-10-31 33 views
16

我使用的AppEngine云终端和客体。我之前已经部署了这些端点,现在我正在更新它们,并且它不适用于Objectify。我已经搬到新机器上并运行最新的appengine 1.8.6。已经尝试在classpath中添加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)端点不再支持物化3.1 2)端点有最新版本

最有可能的#1的错误......我一直更新到4.0反正。 ..

回答

18

由于物化的普及,在之前的版本中加入一种解决方法,以支持Key类型,直到一个更通用的解决方案是可用的。由于新解决方案可用,解决方法已被删除。现在有两种方法可以解决财产问题。

  1. 添加一个@ApiResourceProperty注释,该注释将导致在序列化过程中从对象中省略键。如果您想要一个简单的解决方案并且不需要访问客户端中的密钥,请使用此方法。
  2. 添加@ApiTransformer注解,提供了一个兼容机制序列化/反序列化领域。如果需要访问客户中的密钥(或其代表),请使用此方法。由于这需要编写一个变压器类,所以比第一个选项更有效。
+0

嗨Dan,无关,我已经偶然发现了有关Google云端点限制的问题,我想知道他们是否仍然存在,答案会很好http://stackoverflow.com/questions/19786339/google -cloud-endpoints-limits-any-proposed-solutions – ZiglioUK

+1

未来将在端点支持物化密钥吗? – Sti

+0

@Sti你的意思是为Objectify Keys重新添加一个显式处理程序?我不这么认为。通用的解决方案既解决了Objectify案件,又解决了其他问题。 –

6

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

​​

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

+1

您可以将@ApiResourceProperty移动到该字段以保存一些混乱 –

0

起初,我不明白的弗洛里给出的答案,它确实是多么有用。因为其他人可能会受益,我会给出一个简短的解释。

如前所述,您可以使用@ApiTransformer定义变压器类。这会将不可序列化的字段(如类型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); 
    } 

    // ... 
} 
0

其他已经提到如何与@ApiResourceProperty@ApiTransformer接近这一点。但我确实需要客户端可用的密钥,我不想为每个客户端都改变整个实体。我尝试用com.google.appengine.api.datastore.Key替换Objectify Key,它看起来像我的情况很好,因为这里的问题主要是由于端点不支持参数化类型。