创建TvShow实例存本地数据库:空指针与符号解析失败求助
错误排查与修复方案
1. "Can not resolve symbol tvShowController" 错误原因及修复
问题根源
readFromApi2是静态方法,无法访问main方法中定义的局部变量tvShowController- 直接
new TvShowController()完全脱离Spring容器管理,导致类中@Autowired注解的tvShowService无法被注入,后续调用会触发空指针
修复步骤
- 让
PayExApplication实现CommandLineRunner接口,利用Spring启动后的生命周期钩子执行逻辑,避免静态方法的限制:
@SpringBootApplication public class PayExApplication implements CommandLineRunner { @Autowired private TvShowController tvShowController; // 由Spring自动注入controller实例 public static void main(String[] args) { SpringApplication.run(PayExApplication.class, args); } @Override public void run(String... args) throws Exception { readFromApi2(); // 容器初始化完成后执行接口调用逻辑 } // 移除static修饰符,改为成员方法,可直接访问类内注入的tvShowController public void readFromApi2() { ObjectMapper objectMapper = new ObjectMapper(); List<Genres> genresList = new ArrayList<>(); try { URL url = new URL("https://api.tvmaze.com/singlesearch/shows?q=breaking%20bad"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode != 200) { throw new RuntimeException("Http Response" + responseCode); } else { StringBuilder infoString = new StringBuilder(); Scanner scanner = new Scanner(url.openStream()); while (scanner.hasNext()) { infoString.append(scanner.nextLine()); } scanner.close(); JsonNode jsonNode = objectMapper.readTree(infoString.toString()); // 增加空值判断,避免解析时触发NPE Double rating = null; if (jsonNode.has("rating") && jsonNode.get("rating").has("average") && !jsonNode.get("rating").get("average").isNull()) { rating = jsonNode.get("rating").get("average").asDouble(); } int id = jsonNode.get("id").asInt(); String name = jsonNode.get("name").asText(); String summary = jsonNode.get("summary").asText(); // 改用API返回的genres数据,替代硬编码 JsonNode genresNode = jsonNode.get("genres"); if (genresNode.isArray()) { for (JsonNode genreNode : genresNode) { String genreStr = genreNode.asText(); genresList.add(Genres.valueOf(genreStr.toUpperCase())); } } TvShow tvShow = new TvShow(id, name, genresList, rating, 60, 54, summary, "Link"); tvShowController.createTvShow(tvShow); } } catch (Exception e) { e.printStackTrace(); } } }
- 删除
main方法中手动new TvShowController()的代码,完全依赖Spring的依赖注入机制。
2. NullPointerException 错误原因及修复
核心触发点
- 手动实例化的
TvShowController中tvShowService为null,调用tvShowService.createTvShow()时触发NPE - JSON解析时未处理空节点,比如
rating.average为null时直接调用asDouble() - 未判断
JsonNode是否存在,比如jsonNode.get("summary")可能返回null
修复措施
- 按照上述步骤通过Spring注入
TvShowController,确保tvShowService被正确初始化 - 保留JSON解析时的空值判断逻辑,避免空节点调用方法
- 确保
TvShow实体类的构造方法支持rating等字段为null的情况(比如设置默认值,或实体类字段允许null)
额外优化建议
- 统一使用Jackson解析JSON,移除JSON-Simple相关代码,避免混合解析导致的类型错误
- 确保
Genres枚举的取值与API返回的字符串匹配(例如API返回"Action",枚举需定义为ACTION,通过转大写匹配)
内容的提问来源于stack exchange,提问作者Nima Saminasab
相关产品推荐
相关产品推荐

