自动装配只有一个实现的接口 - 不满意的bean依赖

时间:2015-08-31 13:26:58

标签: java spring spring-mvc autowired

我的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:   创建名为&#39; spittleController&#39;的bean时出错在文件中定义   [C:\ java的\工作空间\ default.metadata.plugins \ org.eclipse.wst.server.core \ TMP0 \ wtpwebapps \第五章-BuildingSpringWebApplications \ WEB-INF \类\有机\ spittr \网络\ SpittleController.class]:   通过构造函数参数表示不满意的依赖关系   类型为[org.spittr.data.SpittleRepository]的索引0 ::没有限定条件   找到依赖的[org.spittr.data.SpittleRepository]类型的bean:   预计至少有1个豆有资格成为autowire候选人   这种依赖。依赖注释:{};嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   找到类型[org.spittr.data.SpittleRepository]的限定bean   依赖:预计至少有1个bean有资格成为autowire   这种依赖的候选人。依赖注释:{}

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[] { "/" };
    }

}

2 个答案:

答案 0 :(得分:0)

我认为问题在于要扫描的包 - 它没有正确定义,请尝试chaning to:

main.java.org.spittr

或者使用以下方法 - 我认为它更不容易出错。

basePackageClasses = {Spittle.class}

此致 米哈尔

答案 1 :(得分:0)

说实话,我不知道为什么 清理和构建 解决了这个问题。