Api Transformer用于参数化,不可用类型

时间:2014-03-31 18:38:48

标签: google-app-engine google-cloud-endpoints

我正在使用Objectify并希望拥有其Key<>在我的API中传递的类型。我已经创建了一个ApiTransformer,但我的问题是在哪里声明它,因为序列化的Key<> class不可用,因此我不能将其变换器声明为类注释。我尝试在@Api注释中声明它,但它不起作用,我仍然得到错误:

There was a problem generating the API metadata for your Cloud Endpoints classes: java.lang.IllegalArgumentException: Parameterized type com.googlecode.objectify.Key<[my package].User> not supported. 

ApiTransformer看起来像:

public class KeyTransformer implements Transformer<Key<?>, String> {

  public String transformTo(Key<?> in) {
    return in.getString();
  }

  public Key<?> transformFrom(String in) {
    return Key.valueOf(in);
  }

}

在我的@Api中我有:

@Api(name = "users", version = "v1",transformers = {KeyTransformer.class})

2 个答案:

答案 0 :(得分:2)

不幸的是,你不能。正如你所说,你需要在Key类上声明它,你唯一的机会就是。

1)使用@transformer注释重新编译用于客体化的Key类。

2)使用您自己的实现扩展Key类,并在那里定义转换器。

我并不喜欢这些选项中的任何一个,所以我通常解决这个问题的方法是隐藏关键对象getter(使用@ApiResourceProperty(ignored=AnnotationBoolean.TRUE))并仅显示该键的id。

通过这种方式,您可以获得Endpoints frendly对象,唯一的缺点是您必须在需要时手动使用Key.create(YourClass.class, longId)重新构建密钥。

答案 1 :(得分:0)

您可以通过在@Api注释中列出转换来将转换添加到第三方类。我不确定它是否可以参数化,但我不明白为什么不这样做。

https://cloud.google.com/appengine/docs/java/endpoints/javadoc/com/google/api/server/spi/config/Api#transformers()