簡體   English   中英

應用程序啟動失敗 - 考慮在您的配置中定義一個類型的 bean [SpringBoot]

[英]APPLICATION FAILED TO START - Consider defining a bean of type in your configuration [SpringBoot]

我是 Spring 的新手,當我嘗試運行我的應用程序時出現以下錯誤。 我是否缺少任何 Spring 注釋?

我應該創建一個 JpaUpdateRepositoryImpl class 嗎?


應用程序啟動失敗


描述:

com.myapp.domain.service.StoreAsyncService 中構造函數的參數 1 需要找不到類型為“com.myapp.domain.repository.JpaUpdateRepository”的 bean。

行動:

考慮在您的配置中定義“com.myapp.domain.repository.JpaUpdateRepository”類型的 bean。

服務 Class

package com.myapp.domain.service;

import com.myapp.domain.model.Store;
import com.myapp.domain.repository.JpaUpdateRepository;
import com.myapp.facade.ElasticSearchFacade;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ForkJoinPool;

    @Async
    @Service
    public class StoreAsyncService {
    
        static Logger logger = LoggerFactory.getLogger(StoreAsyncService.class);
    
        private Integer partitionSize = 1000;
        private Integer parallelism = 4;
    
        private final ElasticSearchFacade elasticSearch;
    
        private final JpaUpdateRepository repository;
    
        public StoreAsyncService(ElasticSearchFacade elasticSearch, JpaUpdateRepository repository) {
            this.elasticSearch = elasticSearch;
            this.repository = repository;
        }
    
        public void exportStores(List<Store> stores) {
    
            List<List<Store>> storesSubset = Lists.partition(stores, partitionSize);
    
            ForkJoinPool pool = new ForkJoinPool(parallelism);
    
            for (List<Store> storesItem : storesSubset) {
                CompletableFuture.runAsync(() -> sendToElastic(storesItem), pool);
            }
            pool.shutdown();
    
            LocalDateTime localDateTime = LocalDateTime.now();
    
            repository.updateCadConfiguracaoWithLastExecutionDate(localDateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")));
        }
    
        public void sendToElastic(List<Store> stores) {
    
            elasticSearch.post(stores);
    
            logger.info("sentToElastic - {} Stores sent to Elastic", stores.size());
        }
    }

存儲庫

package bcom.myapp.domain.repository;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

    @Repository
    public interface JpaUpdateRepository extends CrudRepository<Object, Integer> {
    
        @Modifying
        @Query("UPDATE CONFIG c SET c.VALOR = :lastExecutionDate WHERE c.CODE = 'EXPORTACAO_WORKER_STORE' ")
        void updateCadConfiguracaoWithLastExecutionDate(@Param("lastExecutionDate") String lastExecutionDate);
    
    }

聚甲醛

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>br.com.getnet</groupId>
    <artifactId>cstores-worker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>tores-worker</name>

    <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.1.RELEASE</version><!--$NO-MVN-MAN-VER$-->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.7.RELEASE</version><!--$NO-MVN-MAN-VER$-->
        </dependency>
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.3.0.0</version><!--$NO-MVN-MAN-VER$-->
            <exclusions>
                <exclusion>
                    <groupId>com.oracle.ojdbc</groupId>
                    <artifactId>simplefan</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.oracle.ojdbc</groupId>
                    <artifactId>ons</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version><!--$NO-MVN-MAN-VER$-->
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>2.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.collections</groupId>
            <artifactId>google-collections</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.1</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>4.1.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置

package com.myapp.infrastructure.config;
import org.apache.http.HttpHost;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

import static org.apache.http.auth.AuthScope.ANY;

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.myapp.infrastructure")
@ComponentScan(basePackages = {"com.myapp.domain"})
public class ElasticSearchConfig {

    @Value("${app.url}")
    String elasticPostUrl;
    @Value("${app.port}")
    Integer elasticPostPort;
    @Value("${app.username}")
    String userName;
    @Value("${app.password}")
    String userPassword;

    BasicCredentialsProvider credentialsProvider;

    @Bean
    public RestHighLevelClient client() {

        UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(userName, userPassword);
        this.credentialsProvider = new BasicCredentialsProvider();
        this.credentialsProvider.setCredentials(ANY, credentials);
        HttpHost httpHost = new HttpHost(elasticPostUrl, elasticPostPort, "http");

        RestClientBuilder builder = RestClient.builder(httpHost)
                .setHttpClientConfigCallback(httpClientBuilder ->
                        httpClientBuilder.setDefaultCredentialsProvider(
                                this.credentialsProvider));


        return new RestHighLevelClient(builder);
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(client());
    }

}

您需要在 class 級別上使用@EnableAsync而不是@Async並在應異步運行的方法上使用@Async ,因為@EnableAsync注釋應用於應用程序類以實現異步行為,並查找標有@Async注釋並在后台線程池。

您可以嘗試在 SpringBoot 主應用程序中為您的存儲庫設置掃描,例如:

@EnableJpaRepositories("...your.repository.package.name")

最好檢查您的導入,package 聲明和配置 java 文件。 請添加它們,我很樂意提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM