如何从 Spring RestTemplate 中的对象获取列表

Posted

技术标签:

【中文标题】如何从 Spring RestTemplate 中的对象获取列表【英文标题】:How to get List from Object in Spring RestTemplate 【发布时间】:2018-09-19 23:38:27 【问题描述】:

如何从对象中获取列表?您可以在下面找到我的代码:

ResponseEntity<Object> responseEntity = restTemplate.getForEntity("localhost:8083/connectors/", Object.class);
Object object = responseEntity.getBody();

实际上对象变量是一个对象列表(字符串),我需要获取所有这些字符串。

如果我把它打印出来 System.out.println(object.toString()); 它看起来像这样:

[objvar, values, test, object, servar, larms, aggregates, sink, records]

我需要获取这些字符串的列表以动态使用它。你能帮忙吗?

【问题讨论】:

使用列表代替对象 【参考方案1】:

试试这个。这应该有效。

ResponseEntity<String[]> responseEntity = restTemplate.getForEntity("localhost:8083/connectors/", String[].class);
List<String> object = Arrays.asList(responseEntity.getBody());

对于简单的情况,上面的代码可以工作,但是当你有复杂的 json 结构要映射时,使用 ParameterizedTypeReference 是理想的。

ResponseEntity<List<String>> responseEntity =
        restTemplate.exchange("localhost:8083/connectors/",
            HttpMethod.GET, null, new ParameterizedTypeReference<List<String>>() 
            );
List<String> listOfString = responseEntity.getBody();

【讨论】:

如果我使用 ResponseEntity> 有一个问题 Type mismatch: cannot convert from ResponseEntity&lt;List&gt; to ResponseEntity&lt;List&lt;String&gt;&gt; 我可以把 List of String 改为 List is a raw type. References to generic type List&lt;E&gt; should be parameterized 和第二行 Type safety: The expression of type List needs unchecked conversion to conform to List&lt;String&gt; 关于第一种方式,您使用原始类型。当getBody() 被调用时,您如何检索List&lt;String&gt;?我一般用第二种方式。 @Tom 我认为第一种方法无效。而是使用第二个。 @davidxxx,感谢您指出。汤姆我已经更新了我的答案。看看吧。 @pvpkiran 好多了。 ParameterizedTypeReference 是非常好的替代品。你当然有我的投票:)【参考方案2】:

如果您确定此对象将始终为 List,则将其强制转换

List<?> lst= (List) responseEntity.getBody();

但是,您不能直接将其转换为List&lt;String&gt;,因此您必须通过循环或流检查元素类型以生成类型化列表。 使用的 API 可以通过什么方式返回实际类型?

【讨论】:

【参考方案3】:

你可以试试这个解决方法

List list = java.util.Arrays.asList(object.toString());

或者,您可以使用类似的库 ObjectMapper, 它直接将 json 字符串转换为您想要的模型

【讨论】:

【参考方案4】:

如果使用 jwt 进行授权,然后想要检索一个列表,请遵循代码:

RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        
        // set `content-type` header
        headers.setContentType(MediaType.APPLICATION_JSON);

        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        
        // request body parameters
        Map<String, String> map = new HashMap<>();
        map.put("email", "abc@email.com");
        map.put("password", "pass123");
        

        // build the request
        HttpEntity<Map<String, String>> entity = new HttpEntity<>(map, headers);

        // send POST request
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8080/user/login", entity, String.class);


        HttpHeaders myHeader = new HttpHeaders();
        

        myHeader.add("User-Agent", "Spring's RestTemplate" );
        myHeader.set("Authorization","Bearer "+response.getBody());
        HttpEntity<String> request = new HttpEntity<>(myHeader);
        
    
        ResponseEntity<Product[]> responseEntity = restTemplate.exchange("http://localhost:8080/secure/products", HttpMethod.GET, request, Product[].class);
        List<Product> object = Arrays.asList(responseEntity.getBody());
        
        System.out.println(object);

【讨论】:

【参考方案5】:

这对你有用:

ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity("localhost:8083/connectors/", Object[].class);
List<Object> responseList = Arrays.asList(responseEntity.getBody());

(List[] 而不是 Object[] 也是如此)

【讨论】:

很遗憾不是Type mismatch: cannot convert from ResponseEntity&lt;Object&gt; to ResponseEntity&lt;Object[]&gt; @tom,你是否也添加了 Object[]?

以上是关于如何从 Spring RestTemplate 中的对象获取列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring RestTemplate 中记录响应?

Spring restTemplate 获取原始 json 字符串

Spring Boot:如何使用 WebClient 而不是 RestTemplate 来执行非阻塞和异步调用

如何使用 spring 记录 RestTemplate 请求和响应?

如何在 Java Spring boot 中模拟 RestTemplate?

如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON