[英]Autowiring an interface having only one implementation - Unsatisfied bean dependency
我的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;
}
}
即使我已進行自動接線,但仍得到:
org.springframework.beans.factory.UnsatisfiedDependencyException:在文件[C:\\ java \\ workspaces \\ default.metadata.plugins \\ org.eclipse.wst.server.core \\ tmp0 \\ wtpwebapps \\ Chapter5中創建名稱為'spittleController'的bean時出錯-BuildingSpringWebApplications \\ WEB-INF \\ classes \\ org \\ spittr \\ web \\ SpittleController.class]:通過類型為[org.spittr.data.SpittleRepository]的索引0的構造函數參數表示的不滿意依賴項::沒有類型為[org.org.sg.com.spitr.data.SpittleRepository]的構造器參數。找到依賴項的spittr.data.SpittleRepository]:期望至少有1個bean有資格作為此依賴項的自動裝配候選。 依賴注釋:{}; 嵌套的異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有找到類型為[org.spittr.data.SpittleRepository]的合格Bean:需要至少1個符合此依賴項的自動裝配候選的bean。 依賴注釋:{}
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[] { "/" };
}
}
我認為問題在於要掃描的軟件包-定義不正確,請嘗試更改為:
main.java.org.spittr
或改用以下方法-我認為這種方法不太容易出錯。
basePackageClasses = {Spittle.class}
問候,Michał
老實說,我不知道為什么Clean and Build解決了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.