gpt4 book ai didi

java - Objectify List> 未由 Google App Engine 端点序列化

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:39 24 4
gpt4 key购买 nike

您好,有两个相关的实体:客户和汽车。每个客户可以拥有多辆汽车

这是实体的汇总 View :

public class Customer 
{
//Inner classes for partial loads
public static class NoCars{}

@Id protected String id;
private String fullName;
@Load(unless=NoCars.class) private List<Ref<Car>> cars;
}

public class Car
{
@Id private Long id;
private String makeAndModel;
private String plateNumber;
}

这是一种从数据存储中检索客户及其拥有的所有汽车的方法:

public Customer getCustomer(@Named("id") String customerId)
{
Customer customer = ofy().load().type(Customer.class).id(customerId).now();
if (customer==null)
throw new NotFoundException("customer not found");
else
return customer;
}

endpoints.sh 无法实现这一点,因为类型 List <Ref<Car>>不支持包含在返回类型 Customer 中的 ,但我发现了这个有趣的解决方法:

我创建了类 CustomerPOJO

public class CustomerPOJO
{
private String fullName;
}

并修改了类 Customer 从中扩展

public class Customer extends CustomerPOJO
{
//Inner classes for partial loads
public static class NoCars{}

@Id protected String id;
@Load(unless=NoCars.class) private List<Ref<Car>> cars = new ArrayList<>();
}

getter 方法是:

public CustomerPOJO getCustomer(@Named("id") String customerId)
{
Customer customer = ofy().load().type(Customer.class).id(customerId).now();
if (customer==null)
throw new NotFoundException("customer not found");
else
return customer;
}

注意方法声明 CustomerPOJO 作为返回类型,但它实际上返回一个“完整的” Customer !!!

这适用于 AppEngine 1.8.0 + Objectify 4.0 RC2。它在一次调用中获取客户数据和他拥有的所有汽车及其属性( makeAndModel plateNumber )。

问题出现在升级到 1.8.9 后。 endpoints.sh 仍然有效,因为返回类型是完全兼容的,但在将客户对象解析为 JSON 时,我在运行时遇到异常。

java.io.IOException: com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Direct self-reference leading to cycle (through reference chain: entity.Customer["cars"]->java.util.ArrayList[0]->com.googlecode.objectify.impl.ref.LiveRef["key"]->com.googlecode.objectify.Key["root"])

任何其他适用于 1.8.9 的解决方法? @ApiTransformer 是唯一的选择吗?

最佳答案

解决方案非常简单...只需隐藏 Ref 字段即可。它现在确实为 API 使用者提供了任何值(value),但它只会给解析器带来麻烦:

我替换了 List<Ref<Car>> setter和getter :

public List<Car> getCars()
{
List<Car> ret = new ArrayList<>();
Iterator<Ref<Car>> it = cars.iterator();

while (it.hasNext())
ret.add(it.next().getValue());
return ret;
}

public void setCars(List<Car> newCars)
{
Iterator<Car> it = newCars.iterator();

while (it.hasNext())
addCar(it.next());
}

就这样

关于java - Objectify List<Ref<T>> 未由 Google App Engine 端点序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com