【问题标题】:UnsatisfiedDependencyException - Cannot create bean for facadeUnsatisfiedDependencyException - 无法为外观创建 bean
【发布时间】:2018-05-06 18:32:21
【问题描述】:

我遇到了我自己无法解决的问题。我想当有 Spring 经验的人检查时,解决方案可能很明显。

我有一个非常简单的存储库:

interface MovieRepository extends Repository<Movie, Long> {
Movie findMovieById(Long id);
void save(Movie movie);
}

和门面执行一些动作:

@AllArgsConstructor
public class MovieFacade {

private MovieRepository movieRepository;
private MovieCreator movieCreator;

public MovieDto getMovieById(Long id){
    Optional<Movie> movie = Optional.ofNullable(movieRepository.findMovieById(id));
    return movie.isPresent() ? movie.get().toDto() : null;
}

配置类如下所示:

@Configuration
class MovieConfiguration {

@Bean
MovieFacade movieFacade(MovieRepository repository, MovieCreator movieCreator){
    return new MovieFacade(repository, movieCreator);
}

@Bean
MovieCreator movieCreator(){
    return new MovieCreator();
}

我想创建一些测试,但每次尝试运行它们都会失败:

@RunWith(SpringJUnit4ClassRunner.class)
public class MovieFacadeTest {

@Autowired
MovieFacade movieFacade;

@Test
public void dependecyWorks(){
    assertNotNull(movieFacade);
}

这是我得到的错误:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“com.example.demo.movi​​e.domain.MovieFacadeTest”的bean时出错:通过字段“movieFacade”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“com.example.demo.movi​​e.domain.MovieFacade”类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)} 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:386) 在 org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) 在 org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 在 org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 在 org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:137) 在 com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.example.demo.movi​​e.domain.MovieFacade”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

就我而言,对象movieFacade 应该在MovieConfiguration 中创建,然后在测试类中注入movieFacade。 由于某种原因,它根本不会发生。 我将不胜感激任何可能导致解决此问题的帮助或提示。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    我认为您需要用@ContextConfiguration 注释您的测试类,并提供您的配置类的类引用。在运行 JUNIT 时,它不会在您定义 MovieFacade bean 的位置自动创建 Spring 上下文。您需要在 JUnit 类中提供该引用。

    【讨论】:

      【解决方案2】:

      仔细阅读堆栈跟踪它说:

       nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo.movie.domain.MovieFacade' available: expected at least 1 bean which qualifies as autowire candidate. 
      

      您尚未使用 @Service 或 @Component 注释您的 MovieFacade,因此它不会被应用程序上下文拾取。此外,如果 MovieFacade 与配置类不在同一个包中,则应在配置上方使用 @ComponentScan 注释。 @ComponentScan() 可以将包名和类名作为参数。如果 MovieFacade 与配置文件在同一个包中,则不需要 @ComponentScan,因为默认情况下配置类会扫描自己的包中的组件。

      希望这会有所帮助。

      编辑:另外,MovieRepository 应该有注释@Repository

      【讨论】:

      • 我按照你的建议做了。 Facade 和 Configuration 都在同一个包中:com.example.demo.movi​​e.domain。注解@Service/@Component 加了,问题依旧。
      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2020-11-16
      • 2015-06-19
      • 2019-06-15
      • 2020-07-24
      • 2018-01-31
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多