簡體   English   中英

UnsatisfiedDependencyException - 無法為外觀創建 bean

[英]UnsatisfiedDependencyException - Cannot create bean for facade

我遇到了我自己無法解決的問題。 我想當有 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) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) at org.springframework.supportCapableAbfactory.java:366) populateBean(AbstractAutowireCapableBeanFactory.java:1264) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:386) at org.springframework.test.context.support.DependencyInjectionTestendListener.inionDependencyInjectionDTestendListener.inionD在 org.springframework.test.context.suppor t.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner4.createClassRunner.createClassRunner(SpringJ:Unit) 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) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) a t org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at 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) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Metho d) 在 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)}

就我而言,應該在MovieConfiguration創建對象movieFacade ,然后在測試類中注入movieFacade 出於某種原因,它根本不會發生。 我將不勝感激任何可能導致解決此問題的幫助或提示。

仔細閱讀堆棧跟蹤,它說:

 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

我認為您需要使用@ContextConfiguration注釋您的測試類並提供您的配置類的類引用。 在運行 JUNIT 時,它不會在您定義 MovieFacade bean 的地方自動創建 Spring 上下文。 您需要在 JUnit 類中提供該引用。

暫無
暫無

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

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