Home > database >  UnsatisfiedDependencyException error in creating bean name in REST API
UnsatisfiedDependencyException error in creating bean name in REST API

Time:11-27

** 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'; nested exception is 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? 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.396 INFO 11700 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2021-11-26 20:30:57.410 INFO 11700 --- [ restartedMain] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-11-26 20:30:57.437 ERROR 11700 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter: **


APPLICATION FAILED TO START


Description:

The dependencies of some of the beans in the application context form a cycle:

bookRestController (field private BookAuthorManyToManyRelationship.service.BookService BookAuthorManyToManyRelationship.Rest.BookRestController.bookService) ┌─────┐ | bookServiceImpl (field private 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. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.*

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);
    }
    
}
```

CodePudding user response:

You mixing spring-data-jpa and hibernate. either use JPA or Hibernate. Face same issue when i was begginer in spring-boot. Here down give you better example how to work with 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. And always declare variable in entity with private access modifier because it's protect your data.

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

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

}

Repository2

@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

    @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

 @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

@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);
        }
        
    }

CodePudding user response:

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.

  • Related