Spring Boot费用追踪项目启动报错:找不到CategoryRepository类型Bean
问题概述
搭建费用追踪(expense tracker)项目基础结构后,启动时出现Bean找不到的错误,无法正常启动应用。
错误信息
APPLICATION FAILED TO START
描述:
com.app.expensetracker.service.CategoryServiceImpl中的categoryRepository字段需要类型为'com.app.expensetracker.dao.CategoryRepository'的Bean,但未找到。
注入点带有以下注解:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
建议操作:
考虑在配置中定义类型为'com.app.expensetracker.dao.CategoryRepository'的Bean。
相关代码片段
CategoryRepository
package com.app.expensetracker.dao; import com.app.expensetracker.entity.Category; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface CategoryRepository extends JpaRepository<Category, String> { }
Category实体类
package com.app.expensetracker.entity; import jakarta.persistence.*; import lombok.*; import java.util.List; @Entity @Table(name = "category") @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Builder @ToString public class Category { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="cat_id",nullable = false) private String cat_id; @Column(name="categoryName") private String categoryName; @Column(name="users") private List<String> users; // @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY) // @JoinColumn(name = "user_id") // private User user; }
CategoryService接口
package com.app.expensetracker.service; import com.app.expensetracker.dto.CategoryCreateRequest; import com.app.expensetracker.entity.Category; import org.springframework.http.ResponseEntity; import java.util.Optional; public interface CategoryService { Category createCategory(CategoryCreateRequest categoryCreateRequest); ResponseEntity<Optional<Category>> getCategoryById(String category_id); Category updateCategory(String categoryId, CategoryCreateRequest categoryCreateRequest); ResponseEntity<Optional<Category>> deleteCategoryById(String category_id); }
CategoryServiceImpl实现类
package com.app.expensetracker.service; import com.app.expensetracker.dao.CategoryRepository; import com.app.expensetracker.dto.CategoryCreateRequest; import com.app.expensetracker.entity.Category; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @Service public class CategoryServiceImpl implements CategoryService{ @Autowired private CategoryRepository categoryRepository; @Override @Transactional public Category createCategory(CategoryCreateRequest categoryCreateRequest){ Category category = categoryCreateRequest.to(); return categoryRepository.save(category); } @Override @Transactional public ResponseEntity<Optional<Category>> getCategoryById(String category_id){ Optional<Category> category = categoryRepository.findById(category_id); if(category == null){ return ResponseEntity.notFound().build(); } else{ return ResponseEntity.ok(category); } } @Override @Transactional public Category updateCategory(String categoryId, CategoryCreateRequest categoryCreateRequest){ Category category = categoryCreateRequest.to(); return categoryRepository.save(category); } @Override @Transactional public ResponseEntity<Optional<Category>> deleteCategoryById(String category_id){ Optional<Category> category = categoryRepository.findById(category_id); if(category == null){ return ResponseEntity.notFound().build(); } else{ categoryRepository.deleteById(category_id); return ResponseEntity.ok(category); } } }
ExpenseTrackerApplication启动类
package com.app.expensetracker; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication //(exclude = {DataSourceAutoConfiguration.class }) //@ComponentScan(basePackages = "com.app.*") //@EntityScan("com.app.*") @EnableJpaRepositories(basePackages = "com.app.expensetracker.repository") public class ExpenseTrackerApplication { public static void main(String[] args) { SpringApplication.run(ExpenseTrackerApplication.class, args); } }
解决方案
问题根源在于启动类中@EnableJpaRepositories注解的包路径配置错误:你的CategoryRepository实际位于com.app.expensetracker.dao包下,但注解中指定的扫描路径是com.app.expensetracker.repository,导致Spring无法找到该Repository接口并创建对应的Bean。
有两种解决方式:
方式一:修正@EnableJpaRepositories的扫描路径
修改启动类中的注解,将basePackages改为Repository所在的包:
package com.app.expensetracker; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication @EnableJpaRepositories(basePackages = "com.app.expensetracker.dao") public class ExpenseTrackerApplication { public static void main(String[] args) { SpringApplication.run(ExpenseTrackerApplication.class, args); } }
如果存在多个Repository包,可通过数组形式指定多个路径:@EnableJpaRepositories(basePackages = {"com.app.expensetracker.dao", "com.app.expensetracker.other.repository"})
方式二:移除@EnableJpaRepositories注解
@SpringBootApplication注解默认会扫描主类所在包(com.app.expensetracker)及其所有子包下的Spring组件,包括Repository接口。由于你的CategoryRepository已经在com.app.expensetracker.dao(主类包的子包)下,直接删除@EnableJpaRepositories注解,Spring会自动识别并创建Repository Bean:
package com.app.expensetracker; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ExpenseTrackerApplication { public static void main(String[] args) { SpringApplication.run(ExpenseTrackerApplication.class, args); } }
内容的提问来源于stack exchange,提问作者Giribala

