我们有一个服务,它调用各种rest端点,并将JSON响应转换为一个对象。
我们已经看到它在java中完成,服务可以返回一个泛型类型,但不能弄清楚语法。
假设我们有一堆不同API响应的模型,以及一个调用端点并返回其中一个的方法。
public class MyServiceImpl implements MyService{
@Override
public <T> T doGet( String endpoint) {
:
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
:
Gson gson = new Gson();
T model = new T();
model = gson.fromJson(response.getBody(), model.class));
return(model);
}
并因此称为:
SomeModel model = myService.doGet("https://somesite.com/someendpoint")
显然,上面的代码不会起作用,因为您不能执行“new T()”
httpClient有一个内置的方法来实现这一点,而不是以字符串的形式返回响应,但我们不能使用它,原因有二:
1.我们需要记录原始响应字符串(这必须在任何可能失败的json对象Map之前完成)
1.它的“REST”,因此返回状态代码400、404等,这会导致异常并且没有Map,但我们仍然需要读取json休止符并将其转换为对象(在这种情况下,对象中包含错误字段)
1条答案
按热度按时间sy5wg1nm1#
正如Yuliya Sheludyakova所提到的,你不能执行
new T();
,因为javac
由于泛型擦除而缺少类型信息。另外,即使类型和构造函数在此时是已知的,也不需要创建一个新对象,因为Gson在反序列化时返回一个 * new * 对象(Yuliya Sheludyakova也提到了这一点)。您所能做的就是向
fromJson
方法调用提供类型(java.lang.reflect.Type
的一个示例,java.lang.Class
是其中一个具有类型限制功能的示例),以便Gson将有效负载反序列化为所提供类型的对象。第一个
安全方法的使用示例:
请注意,SpringRestTemplate、Retrofit和其他库也有同样的功能,在代码中使用这些库可能是值得的。