客户端的Android GAE多态性

时间:2016-05-13 09:17:08

标签: java android google-app-engine objectify

我正在开发一个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),而不是在客户端检查它是什么类型并使用它)

提前致谢。

1 个答案:

答案 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对象中添加一个附加字段以指示它是什么类型。

希望能让您深入了解该系统的工作原理。