本文介紹了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()。
這篇關于Java 8-CrudRepository<;Developer,Long&>類型中的方法save(S)不適用于參數(可選<;Developer&>)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,