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

Spring Boot中Developer类hasSkill(Skill)不兼容Optional<Skill>入参如何解决

问题根因

编译报错是参数类型不匹配导致:Developer类的hasSkill()方法要求传入Skill类型的入参,但你当前传入的是Optional<Skill>包装类对象,因此方法签名无法匹配。

另外你现有代码还存在隐式风险:直接调用Optional.get()时如果对应id的数据库记录不存在,会直接抛出NoSuchElementException运行时异常,建议补充存在性校验逻辑。

修正后完整代码

@RequestMapping(value="/developer/{id}/skills", method=RequestMethod.POST)
public String developersAddSkill(@PathVariable Long id, @RequestParam Long skillId, Model model) {
    // 先查询两个对象并做存在性校验
    Optional<Skill> optionalSkill = skillRepository.findById(skillId);
    Optional<Developer> optionalDeveloper = repository.findById(id);
    
    // 两个对象都存在才执行后续逻辑
    if (optionalDeveloper.isPresent() && optionalSkill.isPresent()) {
        // 从Optional中取出真实实体对象
        Developer developer = optionalDeveloper.get();
        Skill skill = optionalSkill.get();
        
        if (!developer.hasSkill(skill)) {
            developer.getSkills().add(skill);
        }
        
        repository.save(developer);
        // 存入model的也换成真实实体对象,避免视图层还要处理Optional
        model.addAttribute("developer", developer);
        model.addAttribute("skills", skillRepository.findAll());
        return "redirect:/developer/" + developer.getId();
    }

    model.addAttribute("developers", repository.findAll());
    return "redirect:/developers";
}

补充说明

如果你的skillRepository和repository继承的是CrudRepository,在Spring Boot 2.x版本中findById()默认返回Optional是正常特性,所有涉及查询的逻辑都建议先判断Optional.isPresent()再取值,避免空指针相关异常。


内容的提问来源于stack exchange,提问作者fritzp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 06:15:04