2015-08-31 31 views
2

我有這個控制器在我的Spring MVC的Web應用程序,自動裝配只有一個實現的接口 - 不滿意豆依賴

@Controller 
@RequestMapping("/spittles") 
public class SpittleController { 

    private SpittleRepository spittleRepository; 

    @Autowired 
    public SpittleController(SpittleRepository spittleRepository) { 

     this.spittleRepository = spittleRepository; 
    } 

    public String spittles(Model model) { 

     model.addAttribute(spittleRepository.findSpittles(Long.MAX_VALUE, 20)); 

     return "spittles"; 
    } 

} 

其中SpittleRepository是接口:

public interface SpittleRepository { 

    List<Spittle> findSpittles(long max, int count); 

} 

其中SpittleRepository實施如下:

@Component 
public class SpittleRepositoryImpl 
    implements SpittleRepository { 

    @Override 
    public List<Spittle> findSpittles(long max, int count) { 

     List<Spittle> spittles = new ArrayList<Spittle>(); 
     for (int i = 0; i < count; i++) { 
      spittles.add(new Spittle("Spittle" + i, new Date())); 
     } 
     return spittles; 

    } 

} 

即使我哈VE自動裝配,我得到:

org.springframework.beans.factory.UnsatisfiedDependencyException: 錯誤創建名爲 'spittleController' 在文件中定義 [C豆:\ java的\工作區\ default.metadata.plugins \ org.eclipse.wst.server.core \ tmp0 \ wtpwebapps \ Chapter5-BuildingSpringWebApplications \ WEB-INF \ classes \ org \ spittr \ web \ SpittleController.class]: 通過構造函數參數表達的不完全依賴關係 類型爲[org的索引0 .spittr.data.SpittleRepository]::沒有資格 找到依賴關係的[org.spittr.data.SpittleRepository]類型的bean: 預計至少有1個bean有資格成爲的自動導向候選項這個依賴。依賴註釋:{};嵌套的異常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:[org.spittr.data.SpittleRepository]找到 依賴性否類型的 排位豆:預期至少1豆,其有資格作爲自動裝配 候選這種依賴性。依賴註解:{}

在Java配置文件是:

@Configuration 
@EnableWebMvc     // Enable Spring MVC 
@ComponentScan(basePackages={"org.spittr"}) 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public ViewResolver viewResolver() { 

     InternalResourceViewResolver resolver = 
      new InternalResourceViewResolver(); 
     resolver.setPrefix("/WEB-INF/views/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setExposeContextBeansAsAttributes(true); 

     return resolver; 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer 
    configurer) { 

     /* configure static content handling */ 
     configurer.enable(); 
    } 



} 

和項目結構可以在這裏看到:

enter image description here

RootConfig:

@ComponentScan(basePackages = { "org.spittr" }, 
       excludeFilters = { @Filter(type = FilterType.ANNOTATION, 
              value = EnableWebMvc.class) }) 
public class RootConfig { 

} 

SpittrWebAppInitializer.java

public class SpittrWebAppInitializer extends 
     AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 

     return new Class<?>[] { RootConfig.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     // Specify configuration class 
     return new Class<?>[] { WebConfig.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     // Map DispatcherServlet to/
     return new String[] { "/" }; 
    } 

} 
+0

如果有兩個名爲'SpittleRepository'的接口並且組件實現了一些具有相同名稱的其他接口,檢查導入。 –

+0

@Evgeni:沒有。 –

+0

您是否在定義非Web環境的類中定義了適當的ComponentScanning?請使用RootConfig類的定義更新您的文章。 – Mikajlo8

回答

0

我認爲這個問題是要掃描,它沒有正確定義的包,儘量chaning到:

main.java.org.spittr 

,或者使用下面的方法來代替 - 我認爲它不太容易出錯。

basePackageClasses = {Spittle.class} 

問候, 米哈爾

+0

我不在辦公室,明天再試試,謝謝你的回答。 –

0

說實話,我不知道爲什麼清理並生成解決了這個問題。

相關問題