【问题标题】:Autowiring an interface having only one implementation - Unsatisfied bean dependency自动装配只有一个实现的接口 - 不满足的 bean 依赖关系
【发布时间】: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


【解决方案1】:

说实话,我不知道为什么 Clean and Build 解决了这个问题。

【讨论】:

    【解决方案2】:

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

    main.java.org.spittr
    

    或者改用下面的方法——我认为它更不容易出错。

    basePackageClasses = {Spittle.class}
    

    问候, 米哈乌

    【讨论】:

    • 我不在办公室。明天试试,谢谢你的回答。
    猜你喜欢
    • 2012-02-20
    • 1970-01-01
    • 2019-01-02
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多