Java 8-CrudRepository<Developer,Long&>类型中的方法save(S)不适用于参数(可选<Developer&>)

2022-05-06 00:00:00 spring java optional

我开始使用Spring框架进行Java开发,为了获得比Hello World更复杂的东西,我找到了本教程并尝试遵循。

https://www.toptal.com/spring/beginners-guide-to-mvc-with-spring-framework

我发现的问题是,由于扩展"CrudRepository"的My类返回一个可选的<;Skills>和可选的<;Developer>而不只是一个技能/开发人员对象,因此提议的代码:在DevelopersController.java中出现错误。

    @RequestMapping(value="/developer/{id}/skills", method=RequestMethod.POST)
    public String developersAddSkill(@PathVariable Long id, @RequestParam Long skillId, Model model) {
    Skill skill = skillRepository.findOne(skillId);
    Developer developer = repository.findOne(id);

    if (developer != null) {
        if (!developer.hasSkill(skill)) {
            developer.getSkills().add(skill);
        }
        repository.save(developer);
        model.addAttribute("developer", repository.findOne(id));
        model.addAttribute("skills", skillRepository.findAll());
        return "redirect:/developer/" + developer.getId();
    }

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

我寻找了一些关于Java 8可选的信息,但由于我仍然缺乏编程经验,我很难理解如何正确使用它。

我将代码更改为,并设法排除了其中一个错误...

    @RequestMapping(value="/developer/{id}/skills", method=RequestMethod.POST)
    public String developersAddSkill(
        @PathVariable Long id, 
        @RequestParam Long skillId, 
        Model model) {
    Optional<Skill> skill = skillRepository.findById(skillId);
    Optional<Developer> developer = repository.findById(id);

    developer.get().getSkills();
    if (developer != null) {
        if (!developer.get().hasSkill(skill)) {
            developer.get().getSkills().add(skill);
        }
        repository.save(developer);
        model.addAttribute("developer", repository.findById(id));
        model.addAttribute("skills", skillRepository.findAll());
        return "redirect:/developer/" + developer.getId();
    }
    return "Confused";
}

但我仍然在我的日食中收到错误:

  • 类型列表中的方法Add(Skill)不适用于参数(可选)
  • 未为可选类型定义方法getID()
  • CrudRepository类型中的方法save(S)不适用于参数(可选)

我如何修复此问题? 另外,为什么行:

if (!developer.get().hasSkill(skill)) {

未显示错误,但行:

developer.get().getSkills().add(skill);

是吗?


解决方案

如changelog所述,较新版本的Spring-Data(上面的1.6.0)将为findByID()方法返回可选的。在Spring-Data的以前版本中,如果在数据库中找不到具有指定id的对象,则findById()的结果将为null

如您的示例所示,Optional可能包含一些开发人员,也可能没有开发人员。要检查findById()是否返回了开发人员,您应该使用:

//You probably should rename the developer variable to "result".
Optional<Developer> developer = repository.findById(id);
if(developer.isPresent()){
    //developer found, you can get it.
    Developer aDeveloper = developer.get();
    //aDeveloper.hasSkill(skill); is acessible now.
}else{
    //no developer found with the specified Id.
}

在Spring-Boot的早期版本中,如果Spring数据依赖低于1.6.x,您将使用:

Developer developer = repository.findById(id);
if (developer != null) {
    //developer found       
}

如果在没有开发人员的情况下尝试Developer.get(),将抛出异常。因此,请先查看isPresent()。

相关文章