【问题标题】:How to extract List of objects from ResponseEntity? [closed]如何从 ResponseEntity 中提取对象列表? [关闭]
【发布时间】:2019-07-20 17:06:08
【问题描述】:

这是我的 get API 返回的员工列表。

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/get")
public List<Employee> getEmployee() {
    return employeeFacade.getAllEmployee();
}

我想从ResponseEntity&lt;String&gt; 中提取Employee 对象。

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
//headers.setContentType(MediaType.APPLICATION_JSON);

Employee employee = new Employee();

HttpEntity<Employee> entity = new HttpEntity<Employee>(employee, headers);
ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);

System.out.println("result:" + result);

如何做到这一点?

【问题讨论】:

  • 你的问题是......?
  • 我们可以看看你的响应json吗?
  • 你为什么用String.class是你想要的是一个Employee,而不是一个String?
  • 如果我使用的是employee.class,它会出错,因为我想提取员工列表而不是单个员工。抱歉没有提及
  • 你可以通过'new ParameterizedTypeReference>() {}'

标签: java spring spring-mvc jersey-2.0


【解决方案1】:

如果 API 调用将 Employee 对象中的 List 作为 JSON 返回,那么您可以使用 ParameterizedTypeReference 直接将该 JSON 解析为 List&lt;Employee&gt; 对象

ResponseEntity<List<Employee>> result = restTemplate.exchange(uri, HttpMethod.GET, entity,  new ParameterizedTypeReference<List<Employee>>() {});

getBody() 将返回响应正文

List<Employee> emps = result.getBody();

【讨论】:

    【解决方案2】:

    试试这个:

    import com.fasterxml.jackson.databind.ObjectMapper;

    Employee employee = new ObjectMapper().readValue(result.getBody(), Employee.class);

    另外如果你使用getForObject()而不是exchange(),你也可以直接获取Employee对象。是的,您不必传递 String.class 参数,而是传递 Employee.class

    编辑(如果我想提取列表。怎么做??)

    所以有两种方法可以做到这一点。

    [1] 使用包装类

    public class EmployeeList {
        private List<Employee> employees;
    
        public EmployeeList() {
            employees = new ArrayList<>();
        }
    
        // standard constructor and getter/setter
    }
    
    ResponseEntity<EmployeeList> result = restTemplate.exchange(uri, HttpMethod.GET, entity, EmployeeList.class);
    

    [2] 使用参数化类型引用

    ResponseEntity<List<Employee>> result = restTemplate.exchange(uri, HttpMethod.GET, entity,  new ParameterizedTypeReference<List<Employee>>() {});
    List<Employee> emps = result.getBody();
    

    【讨论】:

    • 在每个响应上创建一个新的 ObjectMapper 既昂贵又不好。
    • 这就是我给出另一个解决方案的原因
    • 那么最佳实践是什么?顺便说一句
    • 由于这里只是一段代码,而不是整个程序,您可以将 ObjectMapper 声明为静态。这是线程安全的。 private final ObjectMapper mapper = new ObjectMapper();
    • 如果我想提取列表。怎么做??
    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2022-01-07
    相关资源
    最近更新 更多