Spring boot:如何处理方法有Skill(Skill)类型中的Developer不适用于参数(可选<Skill>)



我开始学习Spring引导框架,尤其是在MVC概念下使用Spring引导开发应用程序。我找到了一篇文章,并尝试重新实现:

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

我使用了Java 8、Spring Boot 2.5.1和Gradle。在实现过程中,我遇到了几个错误,尤其是在这一部分:

@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";
}

我是Spring Boot和Java的新手。这个问题与上一篇文章类似。我按照Eclipse的建议和上一篇文章中的讨论修改了代码。这是我的新代码:

@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> optionalDeveloper = repository.findById(id);
Developer developer = optionalDeveloper.get();
if (developer != null) {
if (!developer.hasSkill(skill)) {
developer.getSkills().add(skill.get());
}

repository.save(developer);
model.addAttribute("developer", repository.findById(id));
model.addAttribute("skills", skillRepository.findAll());
return "redirect:/developer/" + developer.getId();
}
model.addAttribute("developers", repository.findAll());
return "redirect:/developers";
}

然而,仍然有一个错误:

The method hasSkill(Skill) in the type Developer is not applicable for the arguments (Optional<Skill>

我试着把它修好,但还是做不到。如何解决此问题?每个人都能提出解决方案吗?我将不胜感激。非常感谢。

您有两个问题:

  1. 您正在进行

    Developer developer = optionalDeveloper.get();
    if (developer != null) {
    ...
    

而不检查Optional<开发者>在场。如果Optional不存在(表示没有值(,那么这将抛出一个NoSuchElementException,它不会返回null。

所以,这应该是:

if(optionalDeveloper.isPresent()) {
...
  1. 您已经
if (!developer.hasSkill(skill)) {
developer.getSkills().add(skill);
}

但是developer.hasSkill((将Skill作为参数-您正在传递一个Optional。

所以,这应该是:

if(optionalSkill.isPresent()) {
final Skill skill = optionalSkill.get());
if (!developer.hasSkill(skill)) {
developer.getSkills().add(skill);
}
}

它很简单。当方法实际期望技能对象时,您正在方法内部传递可选变量。

修改代码:

@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()) {
Developer developer = optionalDeveloper.get();
Skill skill = optionalSkill.get();
if (!developer.hasSkill(skill)) {
developer.getSkills().add(skill);
}

repository.save(developer);
model.addAttribute("developer", developer);
model.addAttribute("skills", skillRepository.findAll());
return "redirect:/developer/" + developer.getId();
}
model.addAttribute("developers", repository.findAll());
return "redirect:/developers";
}

相关内容

最新更新