ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-应用程序无法启动Spring Boot

2019-11-08 16:01:17  阅读:193  来源: 互联网

标签:spring-boot apache-kafka spring java


我有一个使用Spring Boot的框架,其中包含控制器RestController类,

@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);
    }
}

在我的服务实现类中,我使用此kafkaStreams对象查找我的不同服务的详细信息.

现在,我将这个框架用作另一个具有Runner类的应用程序中的依赖项,

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();

    }
}

在此类中,我尝试为DataController创建对象.

因此,当我尝试运行应用程序类时,

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

我收到此错误,

***************************
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.

我是Spring Boot的新手.所以我可能在这里做错了.如果需要更多信息,我可以提供.

UPDATE

我的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>

解决方法:

问题是您试图在类DataController中使用bean kafkaStreams,但是在Spring上下文中没有使用此名称的bean.您需要手动创建它,以便以后可以自动布线.

在您的情况下,我建议像这样更新PipelineRunner.java:

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;
    }
}

您不需要自己创建DataController的实例,这将由Spring自动完成.

有关使用Spring的bean方法的更多信息可用there

标签:spring-boot,apache-kafka,spring,java
来源: https://codeday.me/bug/20191108/2009164.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有