我开始使用spring框架进行java开发,为了获得比hello世界更复杂的内容,我找到了本教程并尝试遵循。
https://www.toptal.com/spring/beginners-guide-to-mvc-with-spring-framework
我发现的问题是,建议的代码:在DevelopersController.java中,由于扩展"CrudRepository“的类返回一个可选的< Skill>和可选的< Developer>,而不是仅仅返回一个技能/开发人员对象,在eclipse中出现了错误。
@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";
}但我仍然会在我的月食中发现错误:
我怎么才能解决这个问题?此外,为什么这句话:
if (!developer.get().hasSkill(skill)) {没有显示错误,但行:
developer.get().getSkills().add(skill);有吗?
发布于 2018-07-13 03:21:14
正如变化量g中所述,较新版本的spring(上面1.6.0)将返回findById()方法的可选性。在以前版本的spring中,如果在数据库中找不到具有指定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中,spring数据依赖度低于1.6.x,您将使用:
Developer developer = repository.findById(id);
if (developer != null) {
//developer found
}如果在没有开发人员的情况下尝试developer.get(),就会引发异常。所以,首先检查一下isPresent()。
发布于 2018-07-13 03:12:13
这一行developer.get().getSkills().add(skill);是错的。您正在尝试向类型Skill的列表中添加一个可选选项。
要修复此错误,必须将其更改为developer.get().getSkills().add(skill.get());。
此外,永远不要将业务逻辑放在控制器中。为此,请始终使用服务类。
服务类是您将业务逻辑放置在其中的地方。控制器是将业务逻辑与前端连接起来的地方。
https://stackoverflow.com/questions/51316923
复制相似问题