簡體   English   中英

自動裝配只有一個實現的接口-不滿意的Bean依賴關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM