Spring boot:忽略 Elasticsearch 配置,最终出现异常 org.springframework.b



我无法使用@Autowired创建ElasticsearchRepositorybean。我将此链接作为代码中的参考,以通过 Spring 启动启用弹性搜索功能。我认为我的代码忽略了Elasticsearch configuration.

平台详情:

Operating system: Windows 10
Java: 1.8.0.77 build
IDE: IntelliJ IDEA Community Edition 13.1.4

例外:

 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [repository.PostRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

在项目聚甲醛中

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>1.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.8</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.191</version>
        </dependency>
    </dependencies>
</project>

Elasticsearch configuration

package config;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
    @Configuration
    @PropertySource(value = "classpath:config/elasticsearch.properties")
    @EnableElasticsearchRepositories(basePackages = "repository")
    @Service("searchConfiguration")
    public class ElasticsearchConfiguration {
        @Resource
        private Environment environment;
        @Bean
        public Client client() {
            TransportClient client = new TransportClient();
            TransportAddress address = new InetSocketTransportAddress(environment.getProperty("elasticsearch.host"), Integer.parseInt(environment.getProperty("elasticsearch.port")));
            client.addTransportAddress(address);
            return client;
        }
        @Bean
        ElasticsearchOperations elasticsearchTemplate() {
            return new ElasticsearchTemplate(client());
        }
    }

应用程序属性文件

elasticsearch.host = localhost
 # if you use you local elasticsearch host
elasticsearch.port = 9300

数据映射对象:

package core;
import org.springframework.data.elasticsearch.annotations.Document;
import java.util.UUID;

@Document(indexName = "explore", type = "explore", shards = 1, replicas = 0)
public class FileProperties {
    String id= UUID.randomUUID().toString();
    public String getFilename() {
        return filename;
    }
    public void setFilename(String filename) {
        this.filename = filename;
    }
    String filename;
    public String getSize(long length) {
        return size;
    }
    public void setSize(String size) {
        this.size = size;
    }

    public String getPath(String absolutePath) {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    public String getMimeType() {
        return mimeType;
    }
    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }
    String size;
    String path;
    String mimeType;
}

存储库:我们从 ElasticsearchRepository 扩展而来

package repository;
import core.FileProperties;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Service;

@Service("elasticsearchRepository")
public interface PostRepository extends ElasticsearchRepository<FileProperties, String> {
    Page<FileProperties> findByTagsName(String name, Pageable pageable);
}

数据访问服务

public interface FilePropertiesService  {
    FileProperties save(FileProperties fileProperties);
    FileProperties findOne(String id);
    Iterable<FileProperties> findAll();
package core;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import repository.PostRepository;

@Service("filePropertiesServiceIMPL")
public class FilePropertiesServiceIMPL  implements FilePropertiesService {
    @Autowired(required = true)
    private PostRepository elasticsearchRepository;
    @Override
    public FileProperties save(FileProperties fileProperties) {
       return elasticsearchRepository.save(fileProperties);
    }
    @Override
    public FileProperties findOne(String id) {
        return elasticsearchRepository.findOne(id);
    }
    @Override
    public Iterable<FileProperties> findAll() {
        return  elasticsearchRepository.findAll();
    }
}

测试和结果

package core;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;
import javax.annotation.PostConstruct;

@Slf4j
@EnableAutoConfiguration
@SpringBootApplication
public class AppStart  extends SpringBootServletInitializer {
    @Autowired(required = true)
    public FileSystem exploreFileSystem;

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(AppStart.class);
    }
    @PostConstruct
    @Autowired(required = true)
    public void listen() {
        exploreFileSystem.LetsExploreFileSystem();
    }
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(AppStart.class, args);
    }
}

结果:

 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [repository.PostRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        ... 45 common frames omitted

如果存储库与具有注释@SpringBootApplication的类不在同一或子包中,则必须使用存储库的包作为属性指定以下注释:

@EnableJpaRepositories("repository")

在您的 AppStart 类上。默认情况下,Spring 只会扫描主应用程序类的包和子包。

相关内容

最新更新