【发布时间】:2015-11-25 13:22:40
【问题描述】:
我的 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: 创建文件中定义的名称为“spittleController”的 bean 时出错 [C:\java\workspaces\default.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Chapter5-BuildingSpringWebApplications\WEB-INF\classes\org\spittr\web\SpittleController.class]: 通过构造函数参数表达的不满足的依赖关系 [org.spittr.data.SpittleRepository] 类型的索引 0: : 没有限定 为依赖找到了类型为 [org.spittr.data.SpittleRepository] 的 bean: 预计至少有 1 个 bean 有资格作为 autowire 候选 这种依赖。依赖注解:{};嵌套异常是 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();
}
}
项目结构见这里:
根配置:
@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 类的定义更新您的帖子。
-
仅出于测试目的尝试从 basePackages 更改为基本包类 >> @ComponentScan(basePackageClasses = {Spittle.class}, rest of code }
-
请添加 SpittrWenAppInitializer.java 源代码。
标签: java spring spring-mvc autowired