我正在使用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})
答案 0 :(得分:2)
不幸的是,你不能。正如你所说,你需要在Key类上声明它,你唯一的机会就是。
1)使用@transformer注释重新编译用于客体化的Key类。
2)使用您自己的实现扩展Key类,并在那里定义转换器。
我并不喜欢这些选项中的任何一个,所以我通常解决这个问题的方法是隐藏关键对象getter(使用@ApiResourceProperty(ignored=AnnotationBoolean.TRUE)
)并仅显示该键的id。
通过这种方式,您可以获得Endpoints frendly对象,唯一的缺点是您必须在需要时手动使用Key.create(YourClass.class, longId)
重新构建密钥。
答案 1 :(得分:0)
您可以通过在@Api注释中列出转换来将转换添加到第三方类。我不确定它是否可以参数化,但我不明白为什么不这样做。