当前位置: 首页 > 知识库问答 >
问题:

无法注册在null中定义的bean'postRepository'。具有该名称的bean已在null中定义

乔鸿骞
2023-03-14

我正在做一个简单的博客后端,作为一个个人项目。我这样做是为了尝试获取一些JavaSpring,我对下面的代码有问题(有很多...)。

我得到的错误正是这样的:定义为null的bean“postRepository”无法注册。已在null中定义了具有该名称的bean,并且已禁用重写。

代码本身在最初使用Hibernate时运行良好,我有2个DAO,2个DAOMPLS,并使用服务类中的DAOMPLS调用DB和back。一切都按预期工作-可以返回完整的用户列表、可以返回完整的帖子列表、单个用户/帖子等。所有crud操作。

如果我理解正确,要切换到Spring Data JPA,我所需要的就是摆脱DAODAO实现,并且每个实体只有一个扩展JpaRepository的接口

后类:

package com.me.website.entity;

@Entity
@Table(name="posts")
public class Post {
    //fields of the Post object
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    @Column(name="title")
    private String title;
    @Column(name="author")
    private String author;
    @Column(name="date")
    private LocalDateTime date;
    @Column(name="excerpt")
    private String excerpt;
    @Column(name="featured_media")
    private byte[] featuredMedia;
    @Column(name="content")
    private String content;
    @Column(name="category")
    private String category;

    //constructor for the Post object
    public Post(String title, String author, LocalDateTime date, String excerpt, byte[] featuredMedia, String content, String category) {
        this.title = title;
        this.author = author;
        this.date = date;
        this.excerpt = excerpt;
        this.featuredMedia = featuredMedia;
        this.content = content;
        this.category = category;
    }

    public Post() {}

    @Override
    public String toString() {
        return "Post{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", author=" + author +
                ", date=" + date +
                ", excerpt='" + excerpt + '\'' +
                ", featuredMedia=" + Arrays.toString(featuredMedia) +
                ", content='" + content + '\'' +
                ", category='" + category + '\'' +
                '}';
    }

    //getters and setters

用户类

package com.me.website.entity;

@Entity
@Table(name="users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Integer id;
    @Column(name="username")
    private String username;
    @Column(name="display_name")
    private String displayName;
    @Column(name="first_name")
    private String firstName;
    @Column(name="last_name")
    private String lastName;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;

    public User() {}

    public User(String username, String displayName, String firstName, String lastName, String email, String password) {
        this.username = username;
        this.displayName = displayName;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
    }


    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", displayName='" + displayName + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

//getters and setters

使用Spring数据JPA的DAO

package com.me.website.dao;

public interface PostRepository extends JpaRepository<Post, Integer> {
    //no implementation required
}
package com.psyonik.website.dao;

public interface UserRepository extends JpaRepository<User, Integer> {
    //no implementation required
}

帖子/用户服务

package com.me.website.service;

public interface PostService {
    public List<Post> findAll();
    public Post findById(int theId);
    public void save(Post thePost);
    public void deleteById(int theId);
}

package com.me.website.service;

public interface UserService {
    public List<User> findAll();
    public User findById(int theId);
    public void save(User theUser);
    public void deleteById(int theId);
}

服务实现

package com.me.website.service;

@Service
public class PostServiceImpl implements PostService {
    private PostRepository postRepository;

    @Autowired
    public PostServiceImpl(PostRepository thePostRepository) {
        postRepository=thePostRepository;
    }

    @Override
    public List<Post> findAll() {
        return postRepository.findAll();
    }

    @Override
    public Post findById(int theId) {
        Post thePost = null;
        Optional<Post> byId = postRepository.findById(theId);
        if (byId.isPresent()) {
            thePost = byId.get();
        }
        return thePost;
    }

    @Override
    public void save(Post thePost) {
        postRepository.save(thePost);
    }

    @Override
    public void deleteById(int theId) {
        postRepository.deleteById(theId);
    }
}
package com.me.website.service;

@Service
public class UserServiceImpl implements UserService {
    private UserRepository userRepository;

    @Autowired
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public List<User> findAll() {
        return userRepository.findAll();
    }

    @Override
    public User findById(int theId) {
        User theUser = null;
        Optional<User> thisUser = userRepository.findById(theId);
        if (thisUser.isPresent()) {
            theUser = thisUser.get();
        }
        return theUser;
    }

    @Override
    public void save(User theUser) {
        userRepository.save(theUser);
    }

    @Override
    public void deleteById(int theId) {
        userRepository.deleteById(theId);
    }
}

POST Rest控制

package com.me.website.restcontroller;

@RestController
@RequestMapping("/")
public class PostRESTController {
    private PostService postService;

    @Autowired
    public PostRESTController(PostService thePostService) {

        postService = thePostService;
    }


    /*GET mapping - this one returns a list of all the posts =========================================================*/
    @GetMapping("/blog")
    public List<Post> findAll() {
        return postService.findAll();
    }


    /*GET mapping - this provides a pathvariable for a postId to retrieve a particular post item or return an error ==*/
    @GetMapping("/blog/{postId}")
    public Post findById(@PathVariable int postId) {
        Post post = postService.findById(postId);
        if (post == null) {
            throw new RuntimeException("Post not found " + postId);
        }
        else return post;
    }


    /*POST mapping - this creates a new blogpost object and saving it to the db ======================================*/
    @PostMapping("/blog")
    public Post addPost(@RequestBody Post thePost) {
        //in case an id is passed, this will be converted to 0 to force an insert instead of an update
        thePost.setId(0);
        postService.save(thePost);
        return thePost;
    }


    /*PUT mapping - this updates a given blog post given the id passed through =======================================*/
    @PutMapping("/blog")
    public Post updatePost(@RequestBody Post thePost) {
        postService.savePost(thePost);
        return thePost;
    }


    /*DELETE mapping - this is to delete a specific blog post item ===================================================*/
    @DeleteMapping("/blog/{blogId}")
    public String deletePost(@PathVariable int blogId) {
        //retrieve the correct post
        Post thePost = postService.findById(blogId);
        //throw exception if null
        if (thePost == null) {
            throw new RuntimeException("This post doesn't exist in db. Post ID: " + blogId);
        }
        else {
            postService.deleteById(blogId);
        }
        return "Deleted post with id: " + blogId;
    }
}
package com.me.website;

@SpringBootApplication
public class WebsiteApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebsiteApplication.class, args);
    }

}

我已经删除了进口声明,因为一切看起来都很好...

我只是不明白为什么会这样。我在想,也许spring bean工厂正在尝试制作不止一个post repository bean,但没有理由这么做。。。

我想我可能只是错过了配置(但事实并非如此,因为spring boot项目的主要方法有SpringBootApplication,它解决了所有这些问题)。

然后我想我需要在JpaRepository接口上添加@Transactional,但如果我从Spring Boot Data留档中正确理解了这一点,情况也不是这样...我需要为两个JpaRepository接口设置bean name属性吗?

如果是这样,为什么?:)构造函数不会使用不同的类名称(PostRepository vs UserRepository)吗?


共有1个答案

景星光
2023-03-14

这两个建议都没有帮助,正如我之前提到的,现在也进行了研究,您实际上不需要@Repository或使用@EnableJpaRepositories("package.name")作为@SpringBootApplication为您执行所有扫描,只要您的存储库在同一个包中。如果您在一个包中为一个实体提供一个存储库,而在另一个包中为另一个实体和另一个存储库提供另一个包,则需要使用此限定符来确保正确扫描包。

这个修复实际上是完全不直观的——我的pom.xml仍然引用了导致问题的spring-boot-starter-data-jdbc。评论出来后,这个问题得到了解决。

对于任何想看到第一个版本与编辑版本之间差异的人,可以在此处查看我的github。数据库是MySQL,它的设置有两个表,一个叫做post,另一个叫做user,在本地运行。希望这对将来的人有帮助:)谢谢你的回答。

 类似资料:
  • 问题内容: 我已经将Spring Boot版本从2.0.3更新到2.1.1,但是我得到了: 我得到了错误-问题是在哪里看并不是一个好的指针。我已经看到了这个问题,但是我实际上更愿意继续禁止覆盖不明确的豆类。 有任何想法吗? 日志输出 问题答案: 好的,我自己发现了这个问题:我在项目中有两次: 和 所以我想说这是一个很好的Spring Boot新功能。 如果您看到这种错误,只需小心不要重复的注释。

  • 问题内容: 我目前正在创建一个有趣的python线性代数模块,并使用该语言进行实践。我最近尝试将类型注释添加到模块中,如下所示: 但是,当我尝试导入它时,它吐出一个。我承认这个问题已经在这里以某种形式得到了回答,但似乎并不能完全解决我的情况。 我想知道的是: 我已经在该文件中按字面值定义了该类。为什么说未定义名称? 如何定义可用于注释的方式(作为)? 问题答案: 您有一份前瞻性声明;函数(作为方法

  • 问题内容: 感谢您支持在本地运行该程序包。 现在在本地运行firstapp时遇到异常。 我添加 ,但仅遇到相同的问题。 请建议我必须设置哪些值 问题答案: 您需要按照错误消息的指示将其作为环境变量提供给本地容器。为此,请向环境变量提供相应的参数,就像将真实的XSUAA实例绑定到您的CloudFoundry微服务时一样。对于本地部署,您必须至少具有以下参数,其中该属性需要与JWT的签名匹配。此外,该

  • 问题内容: 我知道在大多数编程方案中,当元素为0时,首选是将空集合改为空集合。但是,大多数使用JSON的语言(例如JavaScript)会将空列表/对象视为true,将空列表/对象视为false。例如,这既是true也是JavaScript中的对象: 但这也是事实: 这是错误的: 是否有关于JSON的空对象/列表的约定?而数字,布尔值和字符串呢? 问题答案: 如果期望的返回类型是数组,则返回一个空

  • 问题内容: 我正在尝试在python3中编写一个简单的递归函数。在学习OO Java时,我还想编写涉及对象的Python代码。这是我的下面的代码。我提示用户输入一个数字,屏幕应该显示每个小到5的整数。 但是,当我在终端上运行它时,它说:“ NameError:未定义名称’recursive’”。错误如下所示: 是什么导致问题出在这里?我知道如何编写递归函数,给它一个参数,然后使其在终端上运行。但是