Это мой get API, возвращающий список сотрудников.
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/get")
public List<Employee> getEmployee() {
return employeeFacade.getAllEmployee();
}
Я хочу извлечь объект Employee из ResponseEntity<String>.
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.class, это дает ошибку, потому что я хочу извлечь список сотрудников, а не одного сотрудника. извините, что не упомянул об этом
Вы можете передать 'new ParameterizedTypeReference<List<Employee>>() {}'




Попробуй это :
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 статическим. Это потокобезопасно. закрытый окончательный ObjectMapper mapper = new ObjectMapper();
если я хочу извлечь list<Employee>. как это сделать??
Лучшей практикой в приложении для загрузки Spring является @Autowire в объектном отображении по умолчанию, которое Spring уже имеет.
Если вызов API возвращает List из Employee объектов в виде JSON, вы можете напрямую преобразовать этот JSON в List<Employee> объект, используя ParameterizedTypeReference
ResponseEntity<List<Employee>> result = restTemplate.exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<Employee>>() {});
getBody() вернет тело ответа
List<Employee> emps = result.getBody();
А ваш вопрос....?