首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8- CrudRepository<Developer类型中的方法保存(S),Long>不适用于参数(Optional<Developer>)

Java8- CrudRepository<Developer类型中的方法保存(S),Long>不适用于参数(Optional<Developer>)
EN

Stack Overflow用户
提问于 2018-07-13 02:35:36
回答 2查看 8.1K关注 0票数 3

我开始使用spring框架进行java开发,为了获得比hello世界更复杂的内容,我找到了本教程并尝试遵循。

https://www.toptal.com/spring/beginners-guide-to-mvc-with-spring-framework

我发现的问题是,建议的代码:在DevelopersController.java中,由于扩展"CrudRepository“的类返回一个可选的< Skill>和可选的< Developer>,而不是仅仅返回一个技能/开发人员对象,在eclipse中出现了错误。

代码语言:javascript
复制
    @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(可选的)的信息,但是由于我仍然缺乏编码经验,我很难理解如何正确使用它。

我更改了代码,并设法将其中一个错误删除.

代码语言:javascript
复制
    @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";
}

但我仍然会在我的月食中发现错误:

  • 类型列表中添加(技能)的方法不适用于参数(可选)
  • 对于可选类型,方法getId()未定义
  • CrudRepository类型中的方法save(S)不适用于参数(可选)

我怎么才能解决这个问题?此外,为什么这句话:

代码语言:javascript
复制
if (!developer.get().hasSkill(skill)) {

没有显示错误,但行:

代码语言:javascript
复制
developer.get().getSkills().add(skill);

有吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-13 03:21:14

正如变化量g中所述,较新版本的spring(上面1.6.0)将返回findById()方法的可选性。在以前版本的spring中,如果在数据库中找不到具有指定id的对象,则findById()的结果将是null

如您的示例所示,Optional可能包含一些开发人员或没有开发人员。要检查findById()是否返回了开发人员,您应该使用:

代码语言:javascript
复制
//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,您将使用:

代码语言:javascript
复制
Developer developer = repository.findById(id);
if (developer != null) {
    //developer found       
}

如果在没有开发人员的情况下尝试developer.get(),就会引发异常。所以,首先检查一下isPresent()。

票数 3
EN

Stack Overflow用户

发布于 2018-07-13 03:12:13

这一行developer.get().getSkills().add(skill);是错的。您正在尝试向类型Skill的列表中添加一个可选选项。

要修复此错误,必须将其更改为developer.get().getSkills().add(skill.get());

此外,永远不要将业务逻辑放在控制器中。为此,请始终使用服务类。

服务类是您将业务逻辑放置在其中的地方。控制器是将业务逻辑与前端连接起来的地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51316923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档