Java 8 - The method save(S) in the type CrudRepositorylt;Developer,Longgt; is not applicable for the arguments (Optionallt;Developergt;)(Java 8-CrudRepositorylt;Developer,Long类型中的方法save(S)不适用于参数(可选lt;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()。
这篇关于Java 8-CrudRepository<;Developer,Long&>类型中的方法save(S)不适用于参数(可选<;Developer&>)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java 8-CrudRepository<;Developer,Long&>类型中的方法save(S)不适用于参数(可选<;Developer&>)
基础教程推荐
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01