我有這個控制器在我的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();
}
}
和項目結構可以在這裏看到:
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[] { "/" };
}
}
如果有兩個名爲'SpittleRepository'的接口並且組件實現了一些具有相同名稱的其他接口,檢查導入。 –
@Evgeni:沒有。 –
您是否在定義非Web環境的類中定義了適當的ComponentScanning?請使用RootConfig類的定義更新您的文章。 – Mikajlo8