2016-05-06 4 views
0

Я действительно новый в Spring MVC. Я пишу демо (используйте аннотацию), но он не работает. here is the construction of my demoОшибка впрыскивания Spring Mvc (впрыскивание зависимых от автоподключения)

public class WebInitializer extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 

@Override 
protected Class<?>[] getRootConfigClasses() { 
    return new Class<?>[] { RootConfigure.class }; 
} 

@Override 
protected Class<?>[] getServletConfigClasses() { 
    return new Class<?>[] { Configure.class }; 
} 

@Override 
protected String[] getServletMappings() { 
    return new String[] { "/" }; 
} 

} 

в Configure.java, я объявляю боб 'ContackDAO', как это:

@Configuration 
@ComponentScan(basePackages = "base") 
@EnableWebMvc 
public class Configure extends WebMvcConfigurerAdapter { 

@Bean 
public ViewResolver getViewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix("/WEB-INF/views/"); 
    resolver.setSuffix(".jsp"); 
    return resolver; 
} 

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/resources/**").addResourceLocations(
      "/resources/"); 
} 

@Bean 
public ContactDAO getContactDAO() { 
    return new ContactDAOImpl(); 
} 
} 

в MainControl.java .I нужно использовать ContackDAO, так что я пишу это:

@Controller 
public class MainControl { 
@Autowired 
private ContactDAO contactDAO; 

@RequestMapping(value="/") 
public String listContact() throws IOException{ 
    System.out.println(contactDAO.getBean());// getBean() returns "hello" 
    return "hello"; 
} 
} 

, когда я запустить эту демку, я получаю ошибки:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mainControl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private base.dao.ContactDAO base.contorl.MainControl.contactDAO; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [base.dao.ContactDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

что случилось в моей демонстрации? Вы можете мне помочь?

Я считаю, если я ставлю код:

@Bean 
public ContactDAO getContactDAO() { 
    return new ContactDAOImpl(); 
} 

в RootConfigure.class

@Configuration 
@ComponentScan(basePackages = { "base" }, excludeFilters = { @Filter(type =  FilterType.ANNOTATION, value = EnableWebMvc.class) }) 
public class RootConfigure { 
@Bean 
public ContactDAO getContactDAO() { 
    return new ContactDAOImpl(); 
} 
} 

, демонстрационная запустить successfully.I не знаю, почему ...

+0

Сколько конфигурационных классов у вас есть? –

ответ

0

I надеюсь, что вы не пропустите setter для contactDAO.

+0

Это необходимо для работы @Autowire. Для получения дополнительной информации [info] (http://www.tutorialspoint.com/spring/spring_autowired_annotation.htm) –

+0

Он не использует автотрейдинг сеттера, он определяет bean-компонент, используя аннотацию '@ Bean'. Этот тип автомашины прекрасен. – rapasoft

+0

Вам не нужен сеттер, когда вы упоминаете @Autowire о элементе, который он сам. –

0

Перед тем, как ответить на ваш вопрос, хорошей практикой является правильная структура упаковки.

i.e. in Your case you can put the configuration like this: 

     base.dao.config 
     base.dao.impl 

     base.mvc.config 
     base.mvc.impl 

А затем включите все эти элементы в самую верхнюю конфигурацию. Таким образом, было бы четкое разделение о конфигурации для каждого типа бобов, который снова @Repository, @Service и @Controller

Чтобы ответить на ваш вопрос о том, почему. потому что вы исключаете свой конфигурационный класс mvc в RootConfig.java, используя excludeFilters.

проверка ссылка на excludeFilters в RootConfig.java

Вам нужно первое, что делает @EnableWebMvc понимать и то, что excludeFilters делает что объясняется в ссылке ниже

ComponentScan

Некоторые SO вопросы связанные с подобной вещи:

excludeFilters not working

И еще одно: Filter Specific Packages in Component Scan

+0

Спасибо за ваш ответ! –