Manny Marquez
Manny Marquez

Reputation: 29

Using @Autowire to link my @Service class and @Repository class causes error. Can't seem to find solution

EDIT Solved the problems due to wrong import of the persistence library for my annotations. END OF EDIT

I'm providing all my code for the 'Category' folder, which is where I am having trouble, as well as my main application file. For the "CategoryRepository.java" file I have also tried to use the @Repository annotation as well and it did not change a thing.

DemoApplication.java

package com.learn.servlocal;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

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

}

Category.java

// Category Model
package com.learn.servlocal.category;

import javax.persistence.GeneratedValue;
import com.learn.servlocal.relations.Entity;
import com.learn.servlocal.relations.Id;
import com.learn.servlocal.relations.Table;
import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "Categories")
public class Category {
    @Id @GeneratedValue
    @Getter @Setter private String id;
    @Getter @Setter private String category;

    public Category(String id, String category){
        super();
        this.id = id;
        this.category = category;
    }

    public Category(){

    }
}

CategoryService.java

// Category service to execute all GET, POST, PUT, and DELETE methods
package com.learn.servlocal.category;

import java.util.List;
import java.util.Optional;

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

@Service
public class CategoryService {

    @Autowired
    private CategoryRepository categoryRepository;

    // GET method to retrieve all the categories
    public List<Category> getAllCategories() {
        return (List<Category>)categoryRepository.findAll();
    }

    // GET method for a single category
    public Optional<Category> getCategory(String id) {
        return categoryRepository.findById(id);
    }

    // POST method to add a category
    public void addCategory(Category newCategory) {
        categoryRepository.save(newCategory);
    }

    // PUT method to update a category
    public void updateCategory(String id, Category updatedCategory) {
        Optional<Category> oldCategory = categoryRepository.findById(id);
        oldCategory.ifPresent(newCategory -> categoryRepository.save(newCategory));
    }

    // DELETE method to delete a category
    public void deleteCategory(String id) {
        categoryRepository.deleteById(id);     
    }    
}

CategoryController.java

package com.learn.servlocal.category;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CategoryController {

    @Autowired
    CategoryService categoryService;

    @RequestMapping("/categories")
    public List<Category> getAllCategories(){
        return categoryService.getAllCategories();
    }

    @RequestMapping(value="/categories", method=RequestMethod.POST)
    public void addCategory(@RequestBody Category newCategory) {
        categoryService.addCategory(newCategory);
    }
}

CategoryRepository.java

package com.learn.servlocal.category;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;

@Component
public interface CategoryRepository extends CrudRepository<Category, String> {

}

Debug Console

:: Spring Boot ::        (v2.2.5.RELEASE)

2020-03-13 16:25:48.087  INFO 9308 --- [  restartedMain] com.learn.servlocal.DemoApplication      : Starting DemoApplication on DESKTOP-MCL2D2J with PID 9308 (started by emman in c:\Users\emman\Documents\Entreprenuer Craigslist 2.0\servlocal)
2020-03-13 16:25:48.087  INFO 9308 --- [  restartedMain] com.learn.servlocal.DemoApplication      : No active profile set, falling back to default profiles: default
2020-03-13 16:25:48.232  INFO 9308 --- [  restartedMain] o.s.b.devtools.restart.ChangeableUrls    : The Class-Path manifest attribute in C:\Users\emman\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.2\jaxb-runtime-2.3.2.jar referenced one or more files that do not exist: file:/C:/Users/emman/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jakarta.xml.bind-api-2.3.2.jar,file:/C:/Users/emman/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/txw2-2.3.2.jar,file:/C:/Users/emman/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/istack-commons-runtime-3.0.8.jar,file:/C:/Users/emman/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/stax-ex-1.8.1.jar,file:/C:/Users/emman/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/FastInfoset-1.2.16.jar,file:/C:/Users/emman/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jakarta.activation-api-1.2.1.jar
2020-03-13 16:25:48.233  INFO 9308 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2020-03-13 16:25:48.233  INFO 9308 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2020-03-13 16:25:49.027  INFO 9308 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-03-13 16:25:49.092  INFO 9308 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50ms. Found 1 JPA repository interfaces.
2020-03-13 16:25:50.340  INFO 9308 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2020-03-13 16:25:50.355  INFO 9308 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-03-13 16:25:50.355  INFO 9308 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.31]
2020-03-13 16:25:50.566  INFO 9308 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-03-13 16:25:50.567  INFO 9308 --- [  restartedMain] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2334 ms
2020-03-13 16:25:50.878  INFO 9308 --- [  restartedMain] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-03-13 16:25:50.970  INFO 9308 --- [  restartedMain] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.12.Final
2020-03-13 16:25:51.240  INFO 9308 --- [  restartedMain] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-03-13 16:25:51.394  INFO 9308 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-03-13 16:25:51.925  INFO 9308 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-03-13 16:25:51.955  INFO 9308 --- [  restartedMain] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
2020-03-13 16:25:52.643  INFO 9308 --- [  restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-03-13 16:25:52.656  INFO 9308 --- [  restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-03-13 16:25:52.747  INFO 9308 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2020-03-13 16:25:53.059  WARN 9308 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryController': Unsatisfied dependency expressed through field 'categoryService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryService': Unsatisfied dependency expressed through field 'categoryRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'categoryRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.learn.servlocal.category.Category

Any help is appreciated. Thank you.

Upvotes: 0

Views: 287

Answers (2)

Dạ Nhật
Dạ Nhật

Reputation: 24

I already implemented project the same your situation. You can refer my code, hope you have more idea to solve your problem.

Employee.java

package com.tvp.demo.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "employee")
public class Employee implements Serializable {

  private static final long serialVersionUID = -8577891700634111561L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  private Long id;

  @Column(name = "name", nullable = false)
  private String name;

  @Column(name = "phone")
  private String phone;

  public Employee() {
  }

  public Employee(Long id, String name, String phone) {
    this.id = id;
    this.name = name;
    this.phone = phone;
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getPhone() {
    return phone;
  }

  public void setPhone(String phone) {
    this.phone = phone;
  }

}

EmployeeService.java

package com.tvp.demo.service;

import java.util.List;
import java.util.Optional;

import com.tvp.demo.model.Employee;

public interface EmployeeService {

  Iterable<Employee> findAll();

  List<Employee> search(String s);

  Optional<Employee> findById(Long id);

  void deleteById(Long id);

  void save(Employee employee);
}

EmployeeServiceImpl.java

package com.tvp.demo.service;

import java.util.List;
import java.util.Optional;

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

import com.tvp.demo.model.Employee;
import com.tvp.demo.repository.EmployeeRepository;

@Service
public class EmployeeServiceImpl implements EmployeeService {

  @Autowired
  private EmployeeRepository employeeRepository;

  @Override
  public Iterable<Employee> findAll() {
    return employeeRepository.findAll();
  }

  @Override
  public List<Employee> search(String s) {
    return employeeRepository.findByNameContaining(s);
  }

  @Override
  public Optional<Employee> findById(Long id) {
    return employeeRepository.findById(id);
  }

  @Override
  public void deleteById(Long id) {
    employeeRepository.deleteById(id);
  }

  @Override
  public void save(Employee employee) {
    employeeRepository.save(employee);
  }

}

EmployeeRepository.java

package com.tvp.demo.repository;

import java.util.List;

import org.springframework.data.repository.CrudRepository;

import com.tvp.demo.model.Employee;

public interface EmployeeRepository extends CrudRepository<Employee, Long> {

    List<Employee> findByNameContaining(String s);

}

EmployeeController.java

package com.tvp.demo.controller;

import com.tvp.demo.service.EmployeeService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.tvp.demo.model.Employee;

@Controller
public class EmployeeController {

  @Autowired
  private EmployeeService employeeService;

  @GetMapping("/employees")
  public Iterable<Employee> all(){
    return employeeService.findAll();
  }

}

Upvotes: 0

Marco Behler
Marco Behler

Reputation: 3724

As you are getting the "not a managed type" exception when trying to construct your repository, it looks to me like the imports on the Category class for your persistence annotations are wrong:

import com.learn.servlocal.relations.Entity;
import com.learn.servlocal.relations.Id;
import com.learn.servlocal.relations.Table;

Whereas they should be:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

Upvotes: 3

Related Questions