You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建TvShow实例存本地数据库:空指针与符号解析失败求助

错误排查与修复方案

1. "Can not resolve symbol tvShowController" 错误原因及修复

问题根源

  • readFromApi2是静态方法,无法访问main方法中定义的局部变量tvShowController
  • 直接new TvShowController()完全脱离Spring容器管理,导致类中@Autowired注解的tvShowService无法被注入,后续调用会触发空指针

修复步骤

  1. 让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();
        }
    }
}
  1. 删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:57:54