Java 返回的JSON对象不尊重继承?
我有一个谷歌云端点API,它返回一个Java 返回的JSON对象不尊重继承?,java,google-app-engine,google-cloud-endpoints,objectify,Java,Google App Engine,Google Cloud Endpoints,Objectify,我有一个谷歌云端点API,它返回一个产品对象。此产品对象本身包含另一个非常大的对象(id、名称、文本、描述、图像URL等)。在获取产品列表时,我不需要品牌中的全部信息,只需要id和标题 因此,我尝试将Brand分解为一个基类BrandBase,它只包含一组有限的属性(只有id和title)。在public BrandBase getBrand()方法的Product内部,我返回一个BrandBase对象 但是看看Google云端点的JSON输出,我仍然得到了整个品牌内容(包括所有文本、描述等)。
产品
对象。此产品对象本身包含另一个非常大的对象(id、名称、文本、描述、图像URL等)。在获取产品列表时,我不需要品牌
中的全部信息,只需要id和标题
因此,我尝试将Brand
分解为一个基类BrandBase
,它只包含一组有限的属性(只有id和title)。在public BrandBase getBrand()
方法的Product
内部,我返回一个BrandBase
对象
但是看看Google云端点的JSON输出,我仍然得到了整个品牌内容(包括所有文本、描述等)。所以看起来Google Cloud Endpoint只是查看对象类型并序列化所有内容,而不管类本身中指定的返回类型是什么
@Entity
public class Product {
@Id
private Long id;
@Index
private Ref<BrandBase> brand;
public BrandBase getBrand() {
return brand.get();
}
public void setBrand(BrandBase brand) {
this.brand = Ref.create(brand);
}
...
}
@Entity
public class Brand extends BrandBase {
@Id
private Long id;
@Index
private String name;
private String text;
private String contact;
... all getter/setter ...
}
public abstract class BrandBase {
public abstract Long getId();
public abstract String getName();
public abstract void setName(String name);
}
因此,它仍然包含文本
和联系人
——这两个都未在BrandBase
类中指定
这是谷歌云端点的一个bug还是特性?或者有没有其他方法可以实现我想要的行为:我只想在产品中有一个浅品牌对象,而不是完整的品牌对象。这肯定不是端点中的错误,否则将无法返回多态对象。此外,现有的每个JSON序列化程序都以相同的方式工作
我不是云端点方面的专家,但我经常遇到这个架构问题,并以相同的方式解决它:
您需要将数据模型与API模型分开。来回传递实体对象仅适用于非常简单的实体对象和非常简单的应用程序。当您需要为不同的调用者提供不同的对象视图,或者需要隐藏一些数据时,是时候考虑使用单独的DTO了
对于难以升级的客户端(如现场部署的本机应用程序),应立即启动DTO。这使您可以根据需要自由重构数据模型,同时仔细控制API兼容性。是的,这是更多的工作,但它将节省你的主要头痛的道路上。用于删除大部分样板文件。这肯定不是端点中的错误,否则将无法返回多态对象。此外,现有的每个JSON序列化程序都以相同的方式工作
我不是云端点方面的专家,但我经常遇到这个架构问题,并以相同的方式解决它:
您需要将数据模型与API模型分开。来回传递实体对象仅适用于非常简单的实体对象和非常简单的应用程序。当您需要为不同的调用者提供不同的对象视图,或者需要隐藏一些数据时,是时候考虑使用单独的DTO了
对于难以升级的客户端(如现场部署的本机应用程序),应立即启动DTO。这使您可以根据需要自由重构数据模型,同时仔细控制API兼容性。是的,这是更多的工作,但它将节省你的主要头痛的道路上。用于删除大部分样板文件。这肯定不是端点中的错误,否则将无法返回多态对象。此外,现有的每个JSON序列化程序都以相同的方式工作
我不是云端点方面的专家,但我经常遇到这个架构问题,并以相同的方式解决它:
您需要将数据模型与API模型分开。来回传递实体对象仅适用于非常简单的实体对象和非常简单的应用程序。当您需要为不同的调用者提供不同的对象视图,或者需要隐藏一些数据时,是时候考虑使用单独的DTO了
对于难以升级的客户端(如现场部署的本机应用程序),应立即启动DTO。这使您可以根据需要自由重构数据模型,同时仔细控制API兼容性。是的,这是更多的工作,但它将节省你的主要头痛的道路上。用于删除大部分样板文件。这肯定不是端点中的错误,否则将无法返回多态对象。此外,现有的每个JSON序列化程序都以相同的方式工作
我不是云端点方面的专家,但我经常遇到这个架构问题,并以相同的方式解决它:
您需要将数据模型与API模型分开。来回传递实体对象仅适用于非常简单的实体对象和非常简单的应用程序。当您需要为不同的调用者提供不同的对象视图,或者需要隐藏一些数据时,是时候考虑使用单独的DTO了
对于难以升级的客户端(如现场部署的本机应用程序),应立即启动DTO。这使您可以根据需要自由重构数据模型,同时仔细控制API兼容性。是的,这是更多的工作,但它将节省你的主要头痛的道路上。用于删除大部分样板文件。您看过吗?问题不清楚,JSON与任何实体都不匹配。您看过吗?问题不清楚,JSON与任何实体都不匹配。您看过吗?问题不清楚,JSON与任何实体都不匹配。您看过吗?问题不清楚,JSON与任何实体都不匹配。你是对的,这就是我最后要做的。仅仅传递实体对象看起来很有趣(特别是如果你只是做一个简单的REST接口的话)——但这更灵活。你是对的——这就是我最终要做的。仅仅传递实体对象看起来很有趣(特别是如果你只是做一个简单的REST接口的话)——但这要多得多
{
"id": "6298002603900928",
"title": "magna aliquyam erat, sed",
"description": "Lorem ipsum dolor sit amet...",
"brand": {
"id": "6192449487634432",
"name": "no",
"text": "Lorem ipsum dolor sit amet, ...",
"contact": "Lorem ipsum dolor..."
}
}