简体   繁体   English

REST API 中创建bean名时出现UnsatisfiedDependencyException错误

[英]UnsatisfiedDependencyException error in creating bean name in REST API

** 2021-11-26 20:30:57.375 WARN 11700 --- [ restartedMain] ConfigServletWebServerApplicationContext: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookRestController': Unsatisfied dependency expressed through field 'bookService'; ** 2021-11-26 20:30:57.375 WARN 11700 --- [restartedMain] ConfigServletWebServerApplicationContext:上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“bookRestController”的 bean 时出错:通过字段“bookService”表达的不满足的依赖关系; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookServiceImpl': Unsatisfied dependency expressed through field 'bookService';嵌套的异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookServiceImpl': Unsatisfied dependency expressed through field 'bookService'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'bookServiceImpl': Requested bean is currently in creation: Is there an unresolvable circular reference?嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名称为“bookServiceImpl”的 bean 时出错:当前正在创建请求的 bean:是否存在无法解析的循环引用? 2021-11-26 20:30:57.376 INFO 11700 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean: Closing JPA EntityManagerFactory for persistence unit 'default' 2021-11-26 20:30:57.382 INFO 11700 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Shutdown initiated... 2021-11-26 20:30:57.393 INFO 11700 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Shutdown completed. 2021-11-26 20:30:57.376 INFO 11700 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean: Closing JPA EntityManagerFactory for persistence unit 'default' 2021-11-26 20:30:57.382 INFO 11700 --- 8 [restarted1708] 88 [restarted1708] JPA EntityManagerFactory .zaxxer.hikari.HikariDataSource:HikariPool-1 - 关闭已启动... 2021-11-26 20:30:57.393 INFO 11700 --- [restartedMain] com.zaxxer.hikari.HikariDataSource:HikariPool-1 - 关闭已完成。 2021-11-26 20:30:57.396 INFO 11700 --- [ restartedMain] o.apache.catalina.core.StandardService: Stopping service [Tomcat] 2021-11-26 20:30:57.410 INFO 11700 --- [ restartedMain] ConditionEvaluationReportLoggingListener: 2021-11-26 20:30:57.396 INFO 11700 --- [restartedMain] o.apache.catalina.core.StandardService:停止服务[Tomcat] 2021-11-26 20:30:57.410 INFO 11700 --- [restartedMain ] ConditionEvaluationReportLoggingListener:

Error starting ApplicationContext.启动 ApplicationContext 时出错。 To display the conditions report re-run your application with 'debug' enabled.要显示条件报告,请在启用“调试”的情况下重新运行您的应用程序。 2021-11-26 20:30:57.437 ERROR 11700 --- [ restartedMain] osbdLoggingFailureAnalysisReporter: ** 2021-11-26 20:30:57.437 错误 11700 --- [restartedMain] osbdLoggingFailureAnalysisReporter:**


APPLICATION FAILED TO START应用程序启动失败


Description:描述:

The dependencies of some of the beans in the application context form a cycle: application context中的一些bean的依赖关系形成了一个循环:

bookRestController (field private BookAuthorManyToManyRelationship.service.BookService BookAuthorManyToManyRelationship.Rest.BookRestController.bookService) ┌─────┐ | bookRestController(字段私有 BookAuthorManyToManyRelationship.service.BookService BookAuthorManyToManyRelationship.Rest.BookRestController.bookService)┌──────┐ | bookServiceImpl (field private BookAuthorManyToManyRelationship.service.BookService BookAuthorManyToManyRelationship.serviceImpl.BookServiceImpl.bookService) └─────┘ bookServiceImpl(字段私有 BookAuthorManyToManyRelationship.service.BookService BookAuthorManyToManyRelationship.serviceImpl.BookServiceImpl.bookService)└──────┘

Action:行动:

Relying upon circular references is discouraged and they are prohibited by default.不鼓励依赖循环引用,默认情况下它们是被禁止的。 Update your application to remove the dependency cycle between beans.更新您的应用程序以删除 bean 之间的依赖循环。 As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.*作为最后的手段,可以通过将 spring.main.allow-circular-references 设置为 true 来自动打破循环。*

BasicProjectApplication.java BasicProjectApplication.java

```package BookAuthorManyToManyRelationship;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
public class BasicProjectApplication {

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

}```

**AuthorDAO.java**
```package BookAuthorManyToManyRelationship.dao;

import java.util.List;

import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;

public interface AuthorDAO {
    public Author findById(int id);
    public List<Book> findListOfBookWrittenByAuthor();
    public void deleteById(int id);
    public void save(Author author);
}```

**BookDAO.java**

```package BookAuthorManyToManyRelationship.dao;

import java.util.List;

import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;

public interface BookDAO {
    public Book findById(int id);
    public List<Author> findListOfAuthorWhoHasWrittenThisBook();
    public void deleteById(int id);
    public void save(Book book);
}```

**AuthorDAOImpl.java**

```package BookAuthorManyToManyRelationship.daoImpl;

import java.util.List;

import javax.persistence.EntityManager;

import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import BookAuthorManyToManyRelationship.dao.AuthorDAO;
import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;
@Repository
public class AuthorDAOImpl implements AuthorDAO {
    @Autowired
    private EntityManager entityManager;

    @Override
    public Author findById(int id) {
        Session session = entityManager.unwrap(Session.class);
        Author author = session.get(Author.class, id);
        
        return author;
    }

    @Override
    public List<Book> findListOfBookWrittenByAuthor() {
        
        Session session = entityManager.unwrap(Session.class);
        Query<Book> theQuery = session.createQuery("from Book",Book.class);
        
        List<Book> book = theQuery.getResultList();
        return book;
    }

    @Override
    public void deleteById(int id) {
        
        Session session = entityManager.unwrap(Session.class);
        
        Query theQuery = session.createQuery("delete from Author where author_id=:theid");
        theQuery.setParameter("theid", id);
        theQuery.executeUpdate();
    }

    @Override
    public void save(Author author) {
        Session session = entityManager.unwrap(Session.class);
        session.saveOrUpdate(author);
    }

}```
**BookDAOImpl.java**

```package BookAuthorManyToManyRelationship.daoImpl;

import java.util.List;

import javax.persistence.EntityManager;

import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import BookAuthorManyToManyRelationship.dao.BookDAO;
import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;
@Repository
public class BookDAOImpl implements BookDAO {
    
    @Autowired
    private  EntityManager  entityManager;

    @Override
    public Book findById(int id) {
        
        Session session = entityManager.unwrap(Session.class);
        Book b = session.get(Book.class, id);
        return b;
    }

    @Override
    public List<Author> findListOfAuthorWhoHasWrittenThisBook() {
        
        Session session = entityManager.unwrap(Session.class);
        Query<Author> q = session.createQuery("from Author",Author.class);
        List<Author> author = q.getResultList();
        return author;
    }

    @Override
    public void deleteById(int id) {
        
        Session session = entityManager.unwrap(Session.class);
        Query q = session.createQuery("delete from Book where book_id:=theid");
        q.setParameter("theid", id);
        q.executeUpdate();
    }

    @Override
    public void save(Book book) {
        
        Session session = entityManager.unwrap(Session.class);
        session.saveOrUpdate(book);
        
    }

}```

**Address.java**

```package BookAuthorManyToManyRelationship.entity;

import javax.persistence.Embeddable;

@Embeddable
public class Address {
    String street;
    String city;
    String country;
    public Address(String street, String city, String country) {
        super();
        this.street = street;
        this.city = city;
        this.country = country;
    }
    public Address() {
        super();
        // TODO Auto-generated constructor stub
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    
}```
**Author.java**

```package BookAuthorManyToManyRelationship.entity;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="author")
public class Author {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    int id;
    String authorName;
    Address address;
    @ManyToMany(cascade = CascadeType.ALL)
    List<Book> book;
    public Author() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Author(int id, String authorName,Address address,List<Book> book) {
        super();
        this.id = id;
        this.authorName = authorName;
        this.address = address;
        this.book = book;
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAuthorName() {
        return authorName;
    }
    public void setAuthorName(String authorName) {
        this.authorName = authorName;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public List<Book> getBook() {
        return book;
    }
    public void setBook(List<Book> book) {
        this.book = book;
    }
    
}```
**Book.java**

```package BookAuthorManyToManyRelationship.entity;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="book")
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    int id;
    String book_name;
    String subject;
    @ManyToMany(cascade = CascadeType.ALL)
    List<Author> author;
    public Book() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Book(int id, String book_name, String subject, List<Author> author) {
        super();
        this.id = id;
        this.book_name = book_name;
        this.subject = subject;
        this.author = author;
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getBook_name() {
        return book_name;
    }
    public void setBook_name(String book_name) {
        this.book_name = book_name;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public List<Author> getAuthor() {
        return author;
    }
    public void setAuthor(List<Author> author) {
        this.author = author;
    }
    
    
}```

**AuthorRestController**

```package BookAuthorManyToManyRelationship.Rest;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;
import BookAuthorManyToManyRelationship.service.AuthorService;

@RestController
@RequestMapping("/welcome")
public class AuthorRestController {
    
    @Autowired
    private AuthorService authorService;
    

    @GetMapping("/author/{id}")
    public Author getAuthorById(@PathVariable int id )
    {
        return authorService.findById(id);
    }
    
    
    @GetMapping("/book")
    public List<Book> getBook()
    {
        return authorService.findListOfBookWrittenByAuthor();
    }
    
    @PostMapping("/saveAuthor")
    public void setAuthor(@RequestBody Author author)
    {
        authorService.save(author);
    }
    
    
}```

**BookRestController.java**

```package BookAuthorManyToManyRelationship.Rest;

import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;
import BookAuthorManyToManyRelationship.service.BookService;

@RestController
@RequestMapping("/abc")
public class BookRestController {
    
    @Autowired
    private BookService bookService;
    
    
    @GetMapping("/book/{id}")
    public Book getBookById(@PathVariable int id )
    {
        return bookService.findById(id);
    }
    
    @GetMapping("/author")
    public List<Author> getAuthor()
    {
        return bookService.findListOfAuthorWhoHasWrittenThisBook();
    }
    
    
    @PostMapping("/saveBook")
    public void setBook(@RequestBody Book book)
    {       
        bookService.save(book);
    }
    
}```

**AuthorService.java**

```package BookAuthorManyToManyRelationship.service;

import java.util.List;


import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;

public interface AuthorService {
    public Author findById(int id);
    public List<Book> findListOfBookWrittenByAuthor();
    public void deleteById(int id);
    public void save(Author author);
}```

**BookService.java**

```package BookAuthorManyToManyRelationship.service;

import java.util.List;

import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;
public interface BookService {

    public Book findById(int id);
    public List<Author> findListOfAuthorWhoHasWrittenThisBook();
    public void deleteById(int id);
    public void save(Book book);
    
}```

**AuthorServiceImpl.java**

```package BookAuthorManyToManyRelationship.serviceImpl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import BookAuthorManyToManyRelationship.dao.AuthorDAO;
import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;
import BookAuthorManyToManyRelationship.service.AuthorService;
@Service
public class AuthorServiceImpl implements AuthorService {

    @Autowired
    private AuthorDAO authorDAO;
    
    
    @Override
    @Transactional
    public Author findById(int id) {
        return authorDAO.findById(id);
    }

    @Override
    @Transactional
    public List<Book> findListOfBookWrittenByAuthor() {
        return authorDAO.findListOfBookWrittenByAuthor();
    }

    @Override
    @Transactional
    public void deleteById(int id) {
        authorDAO.deleteById(id);
    }

    @Override
    @Transactional
    public void save(Author author) {
        authorDAO.save(author);
    }

}```

**BookServiceImpl.java**

```package BookAuthorManyToManyRelationship.serviceImpl;

import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import BookAuthorManyToManyRelationship.entity.Author;
import BookAuthorManyToManyRelationship.entity.Book;
import BookAuthorManyToManyRelationship.service.BookService;
@Service
public class BookServiceImpl implements BookService {
    
    @Autowired
    private BookService bookService;
    

    @Override
    @Transactional
    public Book findById(int id) {
        return bookService.findById(id);
    }

    @Override
    @Transactional
    public List<Author> findListOfAuthorWhoHasWrittenThisBook() {
        return bookService.findListOfAuthorWhoHasWrittenThisBook();
    }

    @Override
    @Transactional
    public void deleteById(int id) {
        bookService.deleteById(id);
    }

    @Override
    @Transactional
    public void save(Book book) {
        bookService.save(book);
    }
    
}
```

You mixing spring-data-jpa and hibernate .你混合spring-data-jpahibernate either use JPA or Hibernate .使用JPAHibernate Here down i give you better example how to work with spring data jpa .下面我给你一个更好的例子,如何使用spring data jpa Hibernate also use here for relational mapping and create table but for business logic use spring data jpa built-in method like save() , findAll() , deleteById() , findById() etc... using jpaRepository . Hibernate also use here for relational mapping and create table but for business logic use spring data jpa built-in method like save() , findAll() , deleteById() , findById() etc... using jpaRepository . And always declare variable in entity with private access modifier because it's protect your data.并且始终使用private访问修饰符在实体中声明变量,因为它可以保护您的数据。

Here down is my code:下面是我的代码:

Address地址

@Embeddable
public class Address {
    private String street;
    private String area;
    private String stat;
        
    // getter and setter with constructor
}

Author作者

@Entity
@Table(name="author")
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String authorName;

    @Embedded
    private Address address;

    @ManyToMany(targetEntity = Book.class, cascade = CascadeType.ALL)
    private List<Book> book;

    // getter and setter with constructor
        
}

Book

@Entity
@Table(name="book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String book_name;
    private String subject;

    @ManyToMany(targetEntity = Author.class, mappedBy = "book", cascade = CascadeType.ALL)
    private List<Author> author;
        
    // getter and setter with constructor
}

Repository1存储库1

@Repository
public interface AuthorRepo extends JpaRepository<Author, Integer>{

}

Repository2存储库2

@Repository
public interface BookRepo extends JpaRepository<Book, Integer>{

}

Author Service作者服务

public interface AuthorService {
     public Author findById(int id);
     public List<Book> findListOfBookWrittenByAuthor();
     public void deleteById(int id);
     public void save(Author author);
}

Book Service图书服务

public interface BookService {    
     public Book findById(int id);
     public List<Author> findListOfAuthorWhoHasWrittenThisBook();
     public void deleteById(int id);
     public void save(Book book);        
}

Author Impl作者 Impl

    @Service
    public class AuthorServiceImpl implements AuthorService {
    
        @Autowired
        private AuthorRepo authorRepo;
            
        @Override
        public Author findById(int id) {
            return authorRepo.findById(id).get();
        }
    
        @Override
        public List<Author> findListOfAuthorWhoHasWrittenThisBook() {
            return authorRepo.findAll();
        }
    
        @Override
        public void deleteById(int id) {
            authorRepo.deleteById(id);
        }
    
        @Override
        public void save(Author author) {
            authorRepo.save(author);
        }
    
    }

Book Impl图书实施

    @Service
    public class BookServiceImpl implements BookService {
        
        @Autowired
        private BookRepo bookRepo;    
    
        @Override
        public Book findById(int id) {
            return bookRepo.findById(id).get();
        }
    
        @Override
        public List<Book> findListOfBookWrittenByAuthor() {
            return bookRepo.findAll();
        }
    
        @Override
        public void deleteById(int id) {
            bookRepo.deleteById(id);
        }
    
        @Override
        public void save(Book book) {
            bookRepo.save(book);
        }
        
    }

Rest Controller1 Rest 控制器1

 @RestController
    @RequestMapping("/welcome")
    public class AuthorRestController {
        
        @Autowired
        private AuthorService authorService;
        
    
        @GetMapping("/author/{id}")
        public Author getAuthorById(@PathVariable int id )
        {
            return authorService.findById(id);
        }
        
        
        @GetMapping("/author")
        public List<Author> getAuthor()
        {
            return authorService.findListOfAuthorWhoHasWrittenThisBook();
        }
        
        @PostMapping("/saveAuthor")
        public void setAuthor(@RequestBody Author author)
        {
            authorService.save(author);
        }
           
    }

Rest Controller2 Rest 控制器2

@RestController
    @RequestMapping("/abc")
    public class BookRestController {
        
        @Autowired
        private BookService bookService;
        
        
        @GetMapping("/book/{id}")
        public Book getBookById(@PathVariable int id )
        {
            return bookService.findById(id);
        }
        
        @GetMapping("/book")
        public List<Book> getBook()
        {
            return bookService.findListOfBookWrittenByAuthor();
        }
        
        
        @PostMapping("/saveBook")
        public void setBook(@RequestBody Book book)
        {       
            bookService.save(book);
        }
        
    }

here is cause of your problem这是你的问题的原因

@Service
public class BookServiceImpl implements BookService {
    
@Autowired
private BookService bookService

I am not able to understand why do you have reference of BookService inside it's own implementation, my best guess you wanted to add BookDAO here.我无法理解为什么你在它自己的实现中引用了BookService ,我最好的猜测是你想在这里添加BookDAO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 UnsatisfiedDependencyException - 创建具有名称的 bean 时出错 - UnsatisfiedDependencyException - Error creating bean with name UnsatisfiedDependencyException:使用名称创建 bean 时出错 - UnsatisfiedDependencyException: Error creating bean with name Jenkins 构建 UnsatisfiedDependencyException:创建带有名称的 bean 时出错 - Jenkin build UnsatisfiedDependencyException: Error creating bean with name UnsatisfiedDependencyException:创建名称为“registrationController”的 bean 时出错 - UnsatisfiedDependencyException: Error creating bean with name 'registrationController' UnsatisfiedDependencyException:创建名为“entityManagerFactory”的 bean 时出错 - UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactory' UnsatisfiedDependencyException:创建名称为“ trafficMapper”的bean时出错 - UnsatisfiedDependencyException: Error creating bean with name 'trafficMapper' UnsatisfiedDependencyException:创建名称为“requestMappingHandlerAdapter”的 bean 时出错 - UnsatisfiedDependencyException: Error creating bean with name 'requestMappingHandlerAdapter' UnsatisfiedDependencyException:创建名为“empController”的bean时出错 - UnsatisfiedDependencyException: Error creating bean with name “empController” UnsatisfiedDependencyException:创建名称为&#39;accountController&#39;的bean时出错 - UnsatisfiedDependencyException: Error creating bean with name 'accountController' UnsatisfiedDependencyException:创建bean时出错 - UnsatisfiedDependencyException: error creating bean
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM