我正在开发一个Android应用程序,它使用谷歌应用程序引擎(GAE)作为他的后端,用几句话就是这样的情况......
在后端(App Engine Java端点模块)我有一些@Entity类,如“Vehicle”,“Car”和“SportCar”,其中“SportCar”是@Subclass的“Car”和“Car” “是”车辆“的@Subclass。
{
"indent_size": 2,
"indent_char": " ",
"other": " ",
"indent_level": 0,
"indent_with_tabs": false,
"preserve_newlines": true,
"max_preserve_newlines": 2,
"jslint_happy": true,
"indent_handlebars": true
}
一个端点类“VehicleEndpoint”,它包含一个返回Vehicle实体列表的方法。
@Entity
public class Vehicle{
@Id
private Long id;
private String brand;
}
@Subclass(index = true)
public class Car extends Vehicle{
private int wheelsNumber;
}
@Subclass(index = true)
public class SportCar extends Car{
private boolean hasTurbo;
}
所以,当我从客户端(Android应用程序)调用“listVehicle”时,我收到了一个Vehicle对象列表,但不知道哪个是“Car”,哪个是“SportCar”。 我无法将这些Vehicle对象转换为Car或SportCar,因为子类在客户端无法识别,因为它们不包含在“VehicleEndpoint”类中。
@Api{name = "vehicleEndpoint", version = "v1", resource = "vehicle", ...}
public class VehicleEndpoint {
@ApiMethod(name = "listVehicles", path = "vehicle",
httpMethod = ApiMethod.HttpMethod.GET)
public CollectionResponse<Vehicle> listVehicles(){
...
}
}
另一件我注意到的是,在android端我们导入了Vehicle类,但是它来自另一个包,而不是后端端的相同包(后端包 - &gt;“com。 my.example.backend.entity“和Client-side import-&gt;”com.my.example.backend.endpoint.vehicleEndpoint.model.Vehicle“)。
我们如何在客户端使用多态性? (总是希望返回最抽象的表单或绝对父表单(在本例中为Vehicle),而不是在客户端检查它是什么类型并使用它)
提前致谢。
答案 0 :(得分:0)
另一件我注意到的是在android方面我们 导入Vehicle类,但它来自另一个包,不一样 在后端侧的封装(后端封装 - &gt; &#34; com.my.example.backend.entity&#34;和客户端导入 - &gt; &#34; com.my.example.backend.endpoint.vehicleEndpoint.model.Vehicle&#34;。)
这是Cloud Endpoints中的正确行为。 &#34; com.my.example.backend.entity&#34;是你的后端项目的包。当您同步项目时,Android Studio会为您创建一个客户端库,它可以方便地添加为您的应用项目的一部分。您实际上可以获得Android Studio生成的Cloud Endpoints .jar,并将其复制/粘贴到另一个Android项目中并使用您的API。那个包名&#34; com.my.example.backend.endpoint.vehicleEndpoint.model.Vehicle&#34;是Cloud Endpoints如何创建该jar文件 - 您可以猜测,它来自您在端点类中的API注释。 &#34; vehicleEndpoint&#34; e.g:
@Api(
name = "vehicleEndpoint",
version = "v1",
scopes = {
Constants.EMAIL_SCOPE},
clientIds = {
Constants.WEB_CLIENT_ID,
Constants.ANDROID_CLIENT_ID,
Constants.IOS_CLIENT_ID,
Constants.API_EXPLORER_CLIENT_ID},
audiences = {
Constants.ANDROID_AUDIENCE},
namespace = @ApiNamespace(
ownerDomain = Constants.API_OWNER,
ownerName = Constants.API_OWNER,
packagePath = Constants.API_PACKAGE_PATH
)
)
它的工作方式是这样的,是的,包名称会有所不同,因为后者是一个生成的jar文件,我想这就是它通过API注释创建它的方式。
至于您的投射问题,请记住,当您在客户端中使用API方法时,例如:
List<Vehicle> listVehicle = vehicleEndpoint.listVehicles().execute().getItems();
您将获得一个Json响应,然后将其返回到您的模型对象中。您知道这一点,因为您可以使用API资源管理器来执行您的方法并以纯文本格式查看响应。你看到的一切都是你得到的一切。铸造之类的东西可能不适用于那里。您可能必须在Vehicle对象中添加一个附加字段以指示它是什么类型。
希望能让您深入了解该系统的工作原理。