包含生成的Google Cloud Endpoint客户端库

时间:2016-03-13 20:36:16

标签: java android google-app-engine objectify

我目前正在开发一个使用Google Datastore存储数据的Android项目,可通过带有Objectify库的Cloud Endpoints访问。 objectify库在使用“@Subclass”注释解释多态性方面做得不错,但我遇到的问题是,当我生成用于Android代码的客户端库时,不包括子类。有没有办法强制编译器包含这些类?

这是我正在做的一个基本的例子。让我们从Objectify文档中获取多态性示例:

@Entity
public class Animal {
    @Id Long id;
    String name;
}

@Subclass(index=true)
public class Mammal extends Animal {
    boolean longHair;
}

@Subclass(index=true)
public class Cat extends Mammal {
    boolean hypoallergenic;
}

值得一提的是,所有这三个类都已在“ObjectifyService.factory()。register()”中注册。“使用上面的类我在我的api中有一个类似于这个的方法:

@ApiMethod(
            name = "getAnimals", path = "zoo/getAnimals", httpMethod = ApiMethod.HttpMethod.GET
)
public Collection<Animal> getAnimals(final User user, @Named("IdList") Collection<Long> idList)
        throws UnauthorizedException {
    // If the user is not logged in, throw an UnauthorizedException
    if (user == null) {
        throw new UnauthorizedException("Authorization required");
    }

    Map<Long,Animal> animalMap = ofy().load().type(Animal.class).ids(idList);

    ArrayList<Animal> animals= new ArrayList<>();
    for (Long animalId:idList) {
        animals.add(animalMap.get(animalId));
    }
    return animals;
}

正如您所看到的,最终的ArrayList“animals”可能包含Animals,Mammals或Cats,但生成的库只允许我访问Animal类。我需要确保子代码可用于Android代码。编译器如何知道要包含哪些类,是否有办法强制添加类?多态性是否会延续到客户端,还是只支持服务器端?

1 个答案:

答案 0 :(得分:0)

这不是一个很好的答案,但你可以公开一个返回那些类型的无操作API(实际上只返回null;)。这应该迫使班级生成。如果有更正式的方法,请随时纠正我。