Integration Spring boot et Spring webmvc Erreur:此依赖项没有自动装配候选者

Integration Spring boot et Spring webmvc Erreur : no autowire candidate for this dependency

我正在使用 Spring 引导将其与 Spring WebMVC 和 JDBCTemplate 混合来实现 SOAP 网络服务。我在我的 DAO

上使用 @Autowired 时遇到问题

ContactDAO

public interface ContactDAO {

public void saveOrUpdate(Contact contact);

public void delete(int contactId);

public Contact get(int contactId);

public List<Contact> list();

}

联系DAOImpl

@Repository
@Controller("contactDAO")
public class ContactDAOImpl implements ContactDAO {

private JdbcTemplate jdbcTemplate;

public ContactDAOImpl(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}

@Override
public Contact get(int contactId) {
    String sql = "SELECT * FROM contact WHERE contact_id=" + contactId;
    return jdbcTemplate.query(sql, new ResultSetExtractor<Contact>() {

        @Override
        public Contact extractData(ResultSet rs) throws SQLException,
                DataAccessException {
            if (rs.next()) {
                Contact contact = new Contact();
                contact.setId(rs.getInt("contact_id"));
                contact.setName(rs.getString("name"));
                contact.setEmail(rs.getString("email"));
                contact.setAdress(rs.getString("address"));
                contact.setTelephone(rs.getString("telephone"));
                return contact;
            }

            return null;
        }

    });
}

root-context.xml

<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="contactDAO" class="net.codejava.spring.dao.ContactDAOImpl"/>

ContactEndpoint

@Endpoint
public class ContactEndpoint {
private static final String NAMESPACE_URI = "http://spring.io/guides/gs-producing-web-service";

@Autowired
private ContactDAO contactDAO;

@Autowired
public ContactEndpoint(ContactDAO contactDAO) {
    this.contactDAO = contactDAO;
}

@Cacheable(cacheName="imageCache",  keyGenerator=@KeyGenerator(name="StringKeyCache"))
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getContactRequest")
@RequestMapping(value = "/editContact", method = RequestMethod.GET)
@ResponsePayload
public GetContactResponse getContact(@RequestPayload GetContactRequest request){
  GetContactResponse response = new GetContactResponse();
  response.setContact(contactDAO.get(request.getId()));
  return response;
}

StackTrace

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contactEndpoint' defined in file [C:\KitDev\apache-tomcat-8.0.21\webapps\gs-producing-web-service-0.1.0\WEB-INF\classes\com\spring\countries\ContactEndpoint.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [net.codejava.spring.dao.ContactDAO]: : No qualifying bean of type [net.codejava.spring.dao.ContactDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [net.codejava.spring.dao.ContactDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1139) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1042) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:535) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at javax.servlet.GenericServlet.init(GenericServlet.java:158) ~[servlet-api.jar:3.1.FR]
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231) ~[catalina.jar:8.0.21]
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1034) ~[catalina.jar:8.0.21]
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4913) ~[catalina.jar:8.0.21]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5200) ~[catalina.jar:8.0.21]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ~[catalina.jar:8.0.21]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) ~[catalina.jar:8.0.21]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) ~[catalina.jar:8.0.21]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) ~[catalina.jar:8.0.21]
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940) ~[catalina.jar:8.0.21]
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1738) ~[catalina.jar:8.0.21]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[na:1.7.0_25]
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) ~[na:1.7.0_25]
at java.util.concurrent.FutureTask.run(FutureTask.java:166) ~[na:1.7.0_25]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [net.codejava.spring.dao.ContactDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
... 33 common frames omitted

只需从 ContactDAOImpl class 中删除 @Controller("contactDAO") 并将 @Repository 更改为 @Repository("contactDAO")

事实上,您似乎有 3 个 ContactDAOImpl @Controller, @Repository 声明,<bean id="contactDAO" class="net.codejava.spring.dao.ContactDAOImpl"/> 只使用其中一个,并启用 <component-scan base-packages="net.codejava.spring"/> 或使用 java 配置 @ComponentScan("net.codejava.spring") 带有 @Configuration 注释 class 所以 spring 可以捡起来

我通过将 ContactEndpoint 移动到与我的 DAO 相同的包名称来解决问题,因为起初我的端点在 com.spring.countries 而 DAO 在 net.codejava.spring 因此 Spring找不到绑定。将 ContactEndpoint 移动到 net.codejava.spring 解决了它。感谢您的帮助