Я получаю эту ошибку и не нашел решения в SO или в Интернете, которое помогло бы мне ее устранить.
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.microservices.registration.service.RegistrationService required a bean of type 'com.microservices.registration.repository.RegistrationRepository' that could not be found.
Action:
Consider defining a bean of type 'com.microservices.registration.repository.RegistrationRepository' in your configuration.
Process finished with exit code 0
У меня есть приложение с несколькими микросервисами, и этот сервис обрабатывает часть регистрации. У меня есть аннотация Respository
для репозитория и правильные аннотации Spring повсюду. Я не могу понять, что случилось. Может быть, другая пара глаз сможет обнаружить, что я упускаю.
РегистрацияРепозиторий
package com.microservices.registration.repository;
import com.microservices.registration.model.RegistrationUser;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface RegistrationRepository extends MongoRepository<RegistrationUser, String> {
RegistrationUser findByEmail(String email);
}
РегистрацияСервис
package com.microservices.registration.service;
import com.microservices.registration.model.RegistrationUser;
import com.microservices.registration.repository.RegistrationRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class RegistrationService {
private final RegistrationRepository registrationRepository;
private final KafkaTemplate<String, RegistrationUser> kafkaTemplate;
private static final String GROUP_ID_CONFIG = "registrationGroup";
private enum Status {
PENDING,
APPROVED,
REJECTED
}
@Value("${spring.kafka.topic.name}")
private String kafkaTopic;
@Autowired
public RegistrationService(RegistrationRepository registrationRepository,
KafkaTemplate<String, RegistrationUser> kafkaTemplate){
this.registrationRepository = registrationRepository;
this.kafkaTemplate = kafkaTemplate;
}
public void registerUser(RegistrationUser registrationUser) {
try {
RegistrationUser pendingUser = registrationRepository.findByEmail(registrationUser.getEmail());
if (pendingUser == null) {
registrationUser.setStatus(String.valueOf(Status.PENDING));
//registrationRepository.save(registrationUser); don't save users to db who aren't approved yet.
kafkaTemplate.send(kafkaTopic, registrationUser);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Autowired
public List<RegistrationUser> getAllUsers() {
return registrationRepository.findAll();
}
/**
* To find users in Kafka with a PENDING status, consume the messages
* from the Kafka topic and filter the messages based on their status field.
* Once the user is updated to APPROVED, send the message to the Kafka topic
* and save the user to the database.
*/
@KafkaListener(topics = "registrationUsers", groupId = GROUP_ID_CONFIG)
public void approveUser(RegistrationUser registrationUser) {
try {
if (registrationUser.getStatus().equals(String.valueOf(Status.PENDING))) {
registrationUser.setStatus(String.valueOf(Status.APPROVED));
registrationRepository.save(registrationUser);
kafkaTemplate.send(kafkaTopic, registrationUser);
} else {
registrationUser.setStatus(String.valueOf(Status.REJECTED));
kafkaTemplate.send(kafkaTopic, registrationUser);
}
} catch(Exception e) {
e.printStackTrace();
}
}
public RegistrationUser getUserByEmail(String email) {
return registrationRepository.findByEmail(email);
}
public void deleteUser(String Id) {
registrationRepository.deleteById(Id);
}
}
РегистрацияЗаявка
package com.microservices.registration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient
public class RegistrationApplication {
public static void main(String[] args) {
SpringApplication.run(RegistrationApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Application.properties
spring.application.name=application
spring.kafka.topic.name=registrationUser
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=registrationUser
spring.data.mongodb.uri=mongodb://localhost:27017/registration
spring.data.mongodb.database=registration
logging.level.root=DEBUG
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
logging.level.org.springframework.data.mongodb.core.MongoExceptionTranslator=DEBUG
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
ПОМ.XML
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.microservices</groupId>
<artifactId>microservices</artifactId>
<version>1.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>registration-service</artifactId>
<dependencies>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.1.7.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
<version>1.17.6</version>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.12.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<version>3.0.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-apache-client4</artifactId>
<version>1.19.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-bom</artifactId>
<version>1.17.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
</repository>
</repositories>
</project>
Чтобы использовать репозиторий, вы должны добавить @EnableMongoRepositories
. Например:
@EnableMongoRepositories(basePackages = "com.microservices.registration.repository")
если базовый пакет не указан, будет запущено сканирование пакета аннотированного класса.
Я удалил аннотацию @EntityScan
все вместе. Я попробовал ваше решение, но оно не сработало. На самом деле @EntityScan
нужен только тогда, когда основной класс приложения не находится в том же пакете, что и Entities. Кроме того, аннотации @SpringBootApplication
достаточно для поиска аннотаций в пакете.
О, ты скучаешь по этому: @EnableMongoRepositories(basePackages = "com.microservices.registration.repository")
. И кстати, вам не нужна аннотация @Repository. Дайте мне знать, если это сработает, я обновлю свой ответ.
Большое спасибо. У меня была аннотация @EnableMongoRepositories
в моем классе KafkaConfig
. Я переместил его в основной класс и добавил сканирование basePackages
, и это решило проблему отсутствия бобов.
Кстати, ${spring.boot.version} = 2.7.11-SNAPSHOT.