【问题标题】:How to return a list of custom objects on Objectify如何在 Objectify 上返回自定义对象列表
【发布时间】:2016-02-17 17:09:38
【问题描述】:

我正在开发一个使用 Google App Engine 作为后端的 Android 项目,如下所述:Using Android & Google App Engine on Android Studio

我在后端有一些模型类,比如用户和项目,我正在尝试返回用户拥有的项目列表。

public List<Ref<Item>> getItems() {
    return items;
}

当我尝试Sync Project with Gradle Files 时,我收到此错误:

错误:任务“:backend:appengineEndpointsGetClientLibs”执行失败。 运行端点命令 get-client-lib 时出错:不支持参数化类型 com.googlecode.objectify.Ref≤backend.model.Item>。

我在这里检查了一些其他问题,并通过在我的 getter 方法中添加 @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 注释来构建项目而不会出错。但是添加了这一行之后,我在 Android 应用端就看不到这个方法了。

知道如何在 Android 端获取项目列表吗?

【问题讨论】:

    标签: java android google-app-engine google-cloud-endpoints objectify


    【解决方案1】:

    我通过保存/检索包含序列化集合的对象来做到这一点。类课程实现可序列化。

    语言.java

    import java.io.Serializable;
    import java.util.List;
    
    import com.googlecode.objectify.annotation.Entity;
    import com.googlecode.objectify.annotation.Id;
    import com.googlecode.objectify.annotation.Serialize;
    
    @Entity
    public class Language {
    
        @Id
        private String key;
        private String title;
        @Serialize
        private List<Lesson> lessons;  //here collection
    
        //getters/setters ommited
    }
    

    语言服务.java

    import static com.googlecode.objectify.ObjectifyService.ofy;
    
    import com.google.api.server.spi.config.Api;
    import com.google.api.server.spi.config.ApiMethod;
    import com.google.api.server.spi.config.Named;
    import com.googlecode.objectify.Key;
    import com.googlecode.objectify.ObjectifyService;
    import com.minspok.entity.Language;
    
    @Api(name = "langapi", version = "v1", description = "langapi")
    
    public class LanguageService {
    
        static{
            ObjectifyService.register( Language.class );
        }
    
    
        @ApiMethod(name = "get")
        public Language getLanguage(@Named("key") String key){
            Language language = ofy().load().key(Key.create(Language.class,  
                            key)).now();
            return language;
        }
    
    
        @ApiMethod(name = "create")
        public void createLanguage(Language language){
            ofy().save().entity(language);   
        }
    }
    

    帮助阅读:https://github.com/objectify/objectify/wiki/Entities

    【讨论】:

    • 感谢您的回答!我有一个小问题,我认为应该是List&lt;Ref&lt;Lesson&gt;&gt; lessons 而不是List&lt;Lesson&gt; lessons,我错了吗?我不确定区别/:
    • 我完全不知道您的代码中的 Ref 类是什么。对此一无所知。它是什么?我的答案中的代码是我项目的一部分,它绝对是有效的代码。
    • 使用@Serialize 将使用java 序列化存储数据——通常是不明智的。您可以直接删除 @Serialize,objectify 将分解数据并将其存储为本机 EmbeddedEntity 结构,这是更可取的。但是这两种方法都将对象嵌入到父对象中,这可能不是 OP 想要的。就我个人而言,我会从 API 中消除 Ref,只在 API 边界上来回传递真实对象。您不希望 Refs 在您的 android 客户端中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多