当前位置: 首页 > 知识库问答 >
问题:

从外部jar包含Spring上下文找不到服务

皇甫雨华
2023-03-14

我目前正在使用Spring Boot和基于注释的配置来管理我的Spring应用程序。该项目由注册和外部服务库组成。

服务由带有@Service注释的类组成,并在这些类中注入了@Reposity

注册将注入@服务

项目结构(4个maven项目):

xelamitchell (Parent POM)
  +- domain
  +- service (Spring JPA)

registration (separate project with Spring Boot)

注册对服务有maven依赖。

个人服务:

package org.xelamitchell.service.person;

import org.xelamitchell.domain.person.Person;
import java.util.List;

/**
 * Manages {@link Person}s.
 * 
 * @author amitchell
 */
public interface PersonService {

    List<Person> list();

    Person get(Long id);

    Boolean exists(Long id);

    Person save(Person person);

    Boolean delete(Long id);

}

package org.xelamitchell.service.person;

import org.xelamitchell.domain.person.Person;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;

/**
 *
 * @author amitchell
 */
@Primary
@Service
public class DefaultPersonService implements PersonService {

    private PersonRepository repository;

    protected DefaultPersonService() {}

    @Autowired
    public DefaultPersonService(PersonRepository repository) {
        this.repository = repository;
    }

    @Override
    public List<Person> list() {
        return repository.findAll();
    }

    @Override
    public Person get(Long id) {
        return repository.findOne(id);
    }

    @Override
    public Boolean exists(Long id) {
        return repository.exists(id);
    }

    @Override
    public Person save(Person person) {
        return repository.save(person);
    }

    @Override
    public Boolean delete(Long id) {

        if(id != null) {
            repository.delete(id);
        }

        return repository.exists(id);
    }

}

PersonRepository:

package org.xelamitchell.service.person;

import org.xelamitchell.domain.person.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 *
 * @author amitchell
 */
@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {

}

服务库配置:

@Configuration
public class ServiceContext {
}

应用程序配置

@Configuration
@ComponentScan(basePackages = {"org.xelamitchell"})
@EnableAutoConfiguration
//@Import({WebContext.class, ServiceContext.class})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Spring boot在POM中定义用于应用。

我经常遇到的一个例外是,@Repository类无法被注入到它们各自的@Service

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.xelamitchell.service.person.PersonService org.xelamitchell.registration.PersonController.service; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultPersonService' defined in file [/home/amitchell/Workspace/org/xelamitchell/service/target/classes/org/xelamitchell/service/person/DefaultPersonService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.xelamitchell.service.person.PersonRepository]: : No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
    at org.xelamitchell.registration.Application.main(Application.java:26)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.xelamitchell.service.person.PersonService org.xelamitchell.registration.PersonController.service; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultPersonService' defined in file [/home/amitchell/Workspace/org/xelamitchell/service/target/classes/org/xelamitchell/service/person/DefaultPersonService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.xelamitchell.service.person.PersonRepository]: : No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
    ... 16 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultPersonService' defined in file [/home/amitchell/Workspace/org/xelamitchell/service/target/classes/org/xelamitchell/service/person/DefaultPersonService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.xelamitchell.service.person.PersonRepository]: : No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:747)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    ... 18 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:811)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:739)
    ... 31 common frames omitted

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.xelamitchell.service.person.PersonService org.xelamitchell.registration.PersonController.service; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultPersonService' defined in file [/home/amitchell/Workspace/org/xelamitchell/service/target/classes/org/xelamitchell/service/person/DefaultPersonService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.xelamitchell.service.person.PersonRepository]: : No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
    at org.xelamitchell.registration.Application.main(Application.java:26)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.xelamitchell.service.person.PersonService org.xelamitchell.registration.PersonController.service; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultPersonService' defined in file [/home/amitchell/Workspace/org/xelamitchell/service/target/classes/org/xelamitchell/service/person/DefaultPersonService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.xelamitchell.service.person.PersonRepository]: : No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
    ... 16 more
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultPersonService' defined in file [/home/amitchell/Workspace/org/xelamitchell/service/target/classes/org/xelamitchell/service/person/DefaultPersonService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.xelamitchell.service.person.PersonRepository]: : No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:747)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    ... 18 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.xelamitchell.service.person.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:811)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:739)
    ... 31 more

共有2个答案

申自明
2023-03-14

找到它,在上面添加@Repository,并将此anotation从个性化存储库接口中删除。

丁经略
2023-03-14

讨论后编辑。。。

在应用程序类的顶部添加“@EnableJpaRepositories”和“@EntityScan”。

@EnableJpaRepositories("org.xelamitchell")
@EntityScan("org.xelamitchell")

嗯。。。

 类似资料:
  • 我创建了一个spring boot应用程序,它读取一个excel文件,以便在前端显示数据,因此基本上它是持久数据的来源。我能够从eclipse正确地运行,但是当我创建一个spring boot jar并从命令行运行它时,它会失败,因为jar中没有包含文件。 我尝试了两个位置src/main/resources和/src/main/webapp/WEB-INF/external/,但在这两种情况下都

  • 我有一个罐子x,它有一个类 现在在一个完全不同的项目中,我添加了这个jar作为依赖项。 并导入这个类,如: } 基本上,我在项目中使用了jar的Spring配置文件。 但当我运行我的应用程序时,我会出现以下错误: 信息:java。伊奥。FileNotFoundException:无法打开类路径资源[WEB-INF/assembly/appconfig.xml],因为它不存在。springframe

  • 问题内容: 根据我的阅读,执行以下命令时: 然后,将忽略主类路径,并从清单文件中获取类路径。 此外,在命令行上声明的类路径也将被忽略。所以在: /usr/local/jar/foobar.jar被忽略。 最后,我读过清单文件在jar文件中只能包含相对路径。 因此,如何包含系统上存在的外部jar的绝对路径,而不是正在执行的jar文件中的绝对路径? 问题答案: 您是否有理由避免像这样调用主类 ? 这种

  • 问题内容: 我正在运行一个简单的服务器 当我向主页发出GET请求时,运行时将引发以下错误 我不明白这个错误。有任何想法吗?我正在Cloud9中工作。 我的目录结构是 问题答案: 包含路径是相对的,您需要更新路径以包含“ partials”子文件夹,例如 查看文档

  • 问题内容: 我想用Java构建可运行的jar。我需要在jar中包含一些文件,以便在执行jar时会自动从java类读取文件。因此,我在项目中创建了一个文件夹,并从项目中引用了这些文件。我按照一些教程创建了jar文件,但是无法在jar文件中包含这些外部文件。请让我考虑使用外部文件创建可运行的jar。 我的文件结构是 我访问 的abc.txt 在 test1.java 类。我的代码是 使用eclipse

  • 我想用Java构建一个可运行的jar。我需要在jar中包含一些文件,这样当我执行jar时,文件就会自动从java类中读取。因此,我在项目中创建了一个文件夹,并从项目中引用了这些文件。我按照一些教程创建了jar文件,但我不能在我的jar文件中包含这些外部文件。请允许我使用外部文件创建可运行的jar。 当我使用eclipse导出选项创建可执行jar时,我无法看到jar内部的FileFolder目录。请