Spring Boot微服务调用出现NullPointerException问题求助
问题分析与解决方案
核心问题
报错明确指向UserRating.getUserRating()返回null,调用stream()方法时触发java.lang.NullPointerException。给Rating类添加无参构造无法解决问题,因为根源是UserRating的列表字段未初始化,或远程服务返回的响应未正确映射到该字段。
修复步骤
1. 初始化UserRating的列表字段
修改UserRating类,直接初始化列表字段,从根源避免null:
public class UserRating { private List<Rating> userRating = new ArrayList<>(); public UserRating() {} public UserRating(List<Rating> userRating) { this.userRating = userRating; } public List<Rating> getUserRating() { return userRating; } public void setUserRating(List<Rating> userRating) { this.userRating = userRating; } }
2. 校验远程服务响应格式
确保评分服务返回的JSON结构与UserRating类匹配,正确格式示例:
{ "userRating": [ {"movieId":"1","rating":4}, {"movieId":"2","rating":3} ] }
若远程服务直接返回列表(而非包裹在userRating字段的对象),需调整接收类型为List<Rating>,而非UserRating。
3. 添加空值防护逻辑
在调用远程服务后,增加空值检查,避免意外null导致报错:
// 调用评分服务 UserRating userRating = restTemplate.getForObject( "http://rating-service/ratings/users/{userId}", UserRating.class, userId ); // 空值防护 if (userRating == null) { userRating = new UserRating(); } if (userRating.getUserRating() == null) { userRating.setUserRating(new ArrayList<>()); } // 安全执行流操作 List<CatalogItem> catalogItems = userRating.getUserRating().stream() .map(rating -> { Movie movie = restTemplate.getForObject( "http://movie-service/movies/{movieId}", Movie.class, rating.getMovieId() ); return new CatalogItem(movie.getName(), movie.getDesc(), rating.getRating()); }) .collect(Collectors.toList());
4. 验证服务可用性
确认评分服务已正常启动,直接访问其接口(如http://localhost:端口/ratings/users/foo),检查返回的JSON结构正确且非空。
验证结果
修复后重启服务,访问http://localhost:8080/catalog/foo,应返回预期响应:
[{"name":"Test","desc":"TestDesc","rating":4},{"name":"Test","desc":"TestDesc","rating":3}]
内容的提问来源于stack exchange,提问作者sandeep seervi
相关产品推荐
相关产品推荐

