google-app-engine – 用于参数化,不可用类型的ApiTransformer

我正在使用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})

最佳答案 不幸的是你不能.如你所说,你需要在Key类上声明它,你唯一的机会就是这样做.

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

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

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

这样你得到一个端点frendly对象,唯一的缺点是你必须在需要时手动使用Key.create(YourClass.class,longId)重建密钥.

点赞