Java 8-CrudRepository<;Developer,Long&>类型中的方法save(S)不适用于参数(可选<;Developer&>)
我开始使用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()。
相关文章