使用RestTemplate调用API报错:无适配HttpMessageConverter处理Array类型响应
解决RestTemplate调用API时UnknownContentTypeException异常
错误根源
你代码里使用Array.class作为getForObject的响应类型,这是java.lang.reflect.Array类,并非具体的数组类型(比如Rating[])。Spring的HttpMessageConverter无法将application/json类型的响应转换为这种反射类,因此抛出UnknownContentTypeException。
解决方案
1. 定义响应对应的实体类
首先创建与评分服务返回的JSON结构匹配的实体类,比如Rating:
public class Rating { private String id; private String userId; private String hotelId; private int rating; private String feedback; // 生成getter、setter、无参/全参构造方法 }
(根据实际JSON字段调整类的属性,字段名不匹配时可使用@JsonProperty注解映射)
2. 使用具体类型接收响应
有两种常用方式:
方式一:用具体数组类型接收
修改代码,将响应类型改为Rating[],同时注意动态拼接userId,不要写死固定值:
@Autowired private RestTemplate restTemplate; @Override public User getUser(String userId) { User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User with give id is not found on server !! " + userId)); String url = "http://localhost:8083/ratings/users/" + userId; Rating[] ratings = restTemplate.getForObject(url, Rating[].class); logger.info("Ratings: {}", Arrays.toString(ratings)); // 可将评分列表设置到User对象中(需User类添加ratings属性) user.setRatings(Arrays.asList(ratings)); return user; }
方式二:用ParameterizedTypeReference接收List集合
如果更倾向于用List接收,使用restTemplate.exchange配合ParameterizedTypeReference:
@Autowired private RestTemplate restTemplate; @Override public User getUser(String userId) { User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User with give id is not found on server !! " + userId)); String url = "http://localhost:8083/ratings/users/" + userId; ResponseEntity<List<Rating>> response = restTemplate.exchange( url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Rating>>() {} ); List<Rating> ratings = response.getBody(); logger.info("Ratings: {}", ratings); user.setRatings(ratings); return user; }
3. 确保RestTemplate配置了JSON转换器
如果是手动创建RestTemplate Bean,需确保添加MappingJackson2HttpMessageConverter(Spring Boot自动配置的RestTemplate已默认包含):
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); return restTemplate; }
内容的提问来源于stack exchange,提问作者Gitesh
相关产品推荐
相关产品推荐

