本文介紹了Java 8-CrudRepository<;Developer,Long&>類型中的方法save(S)不適用于參數(shù)(可選<;Developer&>)的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我開始使用Spring框架進(jìn)行Java開發(fā),為了獲得比Hello World更復(fù)雜的東西,我找到了本教程并嘗試遵循。
https://www.toptal.com/spring/beginners-guide-to-mvc-with-spring-framework
我發(fā)現(xiàn)的問題是,由于擴(kuò)展”CrudRepository”的My類返回一個(gè)可選的<;Skills>和可選的<;Developer>而不只是一個(gè)技能/開發(fā)人員對象,因此提議的代碼:在DevelopersController.java中出現(xiàn)錯(cuò)誤。
@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";
}
我尋找了一些關(guān)于Java 8可選的信息,但由于我仍然缺乏編程經(jīng)驗(yàn),我很難理解如何正確使用它。
我將代碼更改為,并設(shè)法排除了其中一個(gè)錯(cuò)誤…
@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";
}
但我仍然在我的日食中收到錯(cuò)誤:
類型列表中的方法Add(Skill)不適用于參數(shù)(可選)
未為可選類型定義方法getID()
CrudRepository類型中的方法save(S)不適用于參數(shù)(可選)
我如何修復(fù)此問題?
另外,為什么行:
if (!developer.get().hasSkill(skill)) {
未顯示錯(cuò)誤,但行:
developer.get().getSkills().add(skill);
是嗎?
推薦答案
如changelog所述,較新版本的Spring-Data(上面的1.6.0)將為findByID()方法返回可選的。在Spring-Data的以前版本中,如果在數(shù)據(jù)庫中找不到具有指定id的對象,則findById()的結(jié)果將為null
。
如您的示例所示,Optional
可能包含一些開發(fā)人員,也可能沒有開發(fā)人員。要檢查findById()是否返回了開發(fā)人員,您應(yīng)該使用:
//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數(shù)據(jù)依賴低于1.6.x,您將使用:
Developer developer = repository.findById(id);
if (developer != null) {
//developer found
}
如果在沒有開發(fā)人員的情況下嘗試Developer.get(),將拋出異常。因此,請先查看isPresent()。
這篇關(guān)于Java 8-CrudRepository<;Developer,Long&>類型中的方法save(S)不適用于參數(shù)(可選<;Developer&>)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,