项目结构正确但Spring无法找到MessageRepository Bean问题求助
文件结构
启动Spring Boot应用时始终报错,提示找不到MessageRepository类型的Bean,错误信息如下:
*************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of constructor in com.example.redacted.project.service.MessageServiceImpl required a bean of type 'com.example.redacted.project.repositories.MessageRepository' that could not be found. Action: Consider defining a bean of type 'com.example.redacted.project.repositories.MessageRepository' in your configuration. Process finished with exit code 1
试过同类问题的解决方案,没用。唯一能临时解决的是把主应用类和Repository放在同一个子文件夹,但这样会导致应用找不到其他组件,引发新问题。
已经给Repository加了@Repository注解,Service接口对应的实现类也尝试过配置相关注解,还试过用@ComponentScan,都没效果。
相关代码
主应用类
package com.example.redacted.project; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableAsync public class Application extends SpringBootServletInitializer implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
MessageRepository
package com.example.redacted.project.repositories; import com.example.redacted.project.model.Message; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @Repository public interface MessageRepository extends CrudRepository<Message, Long> { }
MessageService接口
package com.example.redacted.project.service; import com.example.redacted.project.model.Message; public interface MessageService { Message getMessage(); void setMessage(String message); }
MessageServiceImpl实现类
package com.example.redacted.project.service; import com.example.gegg.project.model.Message; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.example.redacted.project.repositories.MessageRepository; @RequiredArgsConstructor public class MessageServiceImpl implements MessageService { private final MessageRepository messageRepository; @Override public Message getMessage() { long id = 1; String message = String.valueOf(messageRepository.findById(id)); return new Message(); //return message.orElse(null); } @Override public void setMessage(String message) { } }
MessageController
package com.example.redacted.project.controller; import com.example.redacted.project.model.Message; import com.example.redacted.project.service.MessageService; import com.example.redacted.project.support.LogEndoint; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor public class MessageController { private final MessageService messageService; @LogEndoint @GetMapping("/message") public ResponseEntity<Message> getMessage(){ return new ResponseEntity<>(messageService.getMessage(), HttpStatus.OK); } @LogEndoint @GetMapping("/status") public ResponseEntity<String> getStatus(){ return new ResponseEntity<>("Service is good to go",HttpStatus.OK); } }
解决方案
1. 补全Service实现类的Spring注解
你的MessageServiceImpl只加了@RequiredArgsConstructor,缺少@Service注解。Spring无法自动识别这个类为Bean,也就无法完成依赖注入,进而导致它依赖的MessageRepository无法被正确关联。
给MessageServiceImpl添加@Service注解:
@Service // 新增该注解 @RequiredArgsConstructor public class MessageServiceImpl implements MessageService { // ... 原有代码 }
2. 修正Message类的包导入错误
在MessageServiceImpl中,你导入的Message类是com.example.gegg.project.model.Message,但其他类中使用的Message都是com.example.redacted.project.model.Message,包路径不一致会导致Spring无法正确识别实体类,影响Repository的扫描。
修正导入路径:
// 替换错误的导入语句 import com.example.redacted.project.model.Message;
3. 确保Repository被Spring Data扫描(可选)
虽然主应用类在com.example.redacted.project包下,Spring Boot默认会扫描该包及其子包,但如果仍有问题,可以显式添加@EnableJpaRepositories注解指定Repository所在包:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableAsync @EnableJpaRepositories(basePackages = "com.example.redacted.project.repositories") // 新增该注解 public class Application extends SpringBootServletInitializer implements WebMvcConfigurer { // ... 原有代码 }
完成以上三步后重新启动应用,问题即可解决。
内容的提问来源于stack exchange,提问作者mrsteel2935

