Échec du démarrage de l'application Spring Boot

Justin :

J'ai un cadre avec Spring Boot qui contient un contrôleur de RestControllerclasse,

@RequestMapping("/details")
@RestController
public class DataController {
    private KafkaStreams kafkaStreams;

    public DataController(KafkaStreams kafkaStreams) {
        this.kafkaStreams = kafkaStreams;
    }

    @Autowired
    DataService dataService;

    @RequestMapping(value = "getAllDetails", method = RequestMethod.GET)
    public boolean getAllDetails(KafkaStreams kafkaStreams) {
        return ktableService.getAllDetails(kafkaStreams);
    }
}

Dans ma classe de mise en œuvre de service J'utilise cet kafkaStreamsobjet pour trouver les détails de mes différents services.

Maintenant, je me sers de ce cadre comme une dépendance dans mon un de l'autre application où j'ai une classe de coureur,

import org.apache.kafka.streams.KafkaStreams;
@Component
public class PipelineRunner {
    private final StreamsBuilder streamsBuilder;
    private final KafkaProperties kafkaProperties;
    private final SerdesExt serdesExt;

    @Autowired
    public PipelineRunner(StreamsBuilder streamsBuilder, KafkaProperties kafkaProperties, SerdesExt serdesExt) {
        this.streamsBuilder = streamsBuilder;
        this.kafkaProperties = kafkaProperties;
        this.serdesExt = serdesExt;
    }

    @PostConstruct
    public void run() {
        ReflectData.AllowNull.get().addStringable(Utf8.class);
        ReflectData.get().addStringable(Utf8.class);
        DataProcessor processor = new DataProcessor(streamsBuilder, kafkaProperties,
                serdesExt);
        start();
    }

    private void start() {
        KafkaStreams kafkaStreams = new KafkaStreams(streamsBuilder.build(),
                kafkaProperties.getKafkaStreamsProperties(serdesExt));
        System.out.println("----Its is started----");
        DataController controller = new DataController(kafkaStreams);
        kafkaStreams.start();

    }
}

Dans cette classe , je suis en train de créer l'objet pour DataController.

Alors, quand je suis en train d'exécuter la classe d'application,

@SpringBootApplication(scanBasePackages = { "framework package" })
@EnableConfigurationProperties(KafkaProperties.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Je reçois cette erreur,

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in frameworkpackage.controllers.DataController required a bean of type 'org.apache.kafka.streams.KafkaStreams' that could not be found.


Action:

Consider defining a bean of type 'org.apache.kafka.streams.KafkaStreams' in your configuration.

Je suis nouveau au printemps Boot. Donc, je pourrais être en train de faire quelque chose de mal ici. Si plus d'information est nécessaire, je peux fournir.

MISE À JOUR

Mon fichier pom,

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>

    <properties>
        <confluent.version>4.1.0</confluent.version>
        <kafka.version>1.1.0</kafka.version>
        <lombok.version>1.18.0</lombok.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.confluent</groupId>
            <artifactId>kafka-avro-serializer</artifactId>
            <version>${confluent.version}</version>
        </dependency>
        <dependency>
            <groupId>io.confluent</groupId>
            <artifactId>kafka-streams-avro-serde</artifactId>
            <version>${confluent.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-streams</artifactId>
            <version>${kafka.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>${kafka.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-avro</artifactId>
            <version>2.8.5</version>
        </dependency>

    </dependencies>
Pavel Gordon:

Un problème est que vous essayez d'utiliser un haricot kafkaStreams dans votre DataController de classe, mais il n'y a pas de haricots avec ce nom dans le contexte du printemps. Vous devez créer manuellement, vous pouvez lier automatiquement ultérieurement.

Dans votre cas, je vous suggère de mettre à jour PipelineRunner.java comme ceci:

import javax.annotation.PostConstruct;
import org.apache.kafka.streams.KafkaStreams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class PipelineRunner
{
    private final StreamsBuilder streamsBuilder;
    private final KafkaProperties kafkaProperties;
    private final SerdesExt serdesExt;


    @Autowired
    public PipelineRunner(StreamsBuilder streamsBuilder, KafkaProperties kafkaProperties, SerdesExt serdesExt)
    {
        this.streamsBuilder = streamsBuilder;
        this.kafkaProperties = kafkaProperties;
        this.serdesExt = serdesExt;
    }


    @PostConstruct
    public void run()
    {
        ReflectData.AllowNull.get().addStringable(Utf8.class);
        ReflectData.get().addStringable(Utf8.class);
        DataProcessor processor = new DataProcessor(streamsBuilder, kafkaProperties,
            serdesExt);
        start();
    }


    @Bean
    KafkaStreams kafkaStreams()
    {
        KafkaStreams kafkaStreams = new KafkaStreams(
            streamsBuilder.build(),
            kafkaProperties.getKafkaStreamsProperties(serdesExt));
        System.out.println("----Its is started----");
        kafkaStreams.start();
        return kafkaStreams;
    }
}

Vous ne devez créer une instance de DataController par vous-même, cela se fera automatiquement au printemps.

Plus d' informations sur l' approche du printemps de haricots est disponible là - bas

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=209904&siteId=1
conseillé
Classement