我开始学习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>
我试着把它修好,但还是做不到。如何解决此问题?每个人都能提出解决方案吗?我将不胜感激。非常感谢。
您有两个问题:
-
您正在进行
Developer developer = optionalDeveloper.get(); if (developer != null) { ...
而不检查Optional<开发者>在场。如果Optional不存在(表示没有值(,那么这将抛出一个NoSuchElementException,它不会返回null。
所以,这应该是:
if(optionalDeveloper.isPresent()) {
...
- 您已经
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";
}