2015-05-05 4 views
0

Я реализую веб-сервис SOAP, используя Spring, смешивая его с Spring WebMVC и JDBCTemplate. У меня есть проблема с использованием @Autowired на моей DAOИнтеграция Spring boot et Spring webmvc Erreur: нет автоувертера для этой зависимости

ContactDAO

public interface ContactDAO { 

public void saveOrUpdate(Contact contact); 

public void delete(int contactId); 

public Contact get(int contactId); 

public List<Contact> list(); 

} 

ContactDAOImpl

@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; 
     } 

    }); 
} 

корня 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", [email protected](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$1.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 

ответ

0

Я решил problème, перемещая ContactEndpoint к тому же названию пакета, как мой DAO, так как я сначала имел конечную точку в com.spring.countries, а DAO - в net.codejava.spring поэтому Spring не смог найти привязку. Перемещение ContactEndpoint в net.codejava.spring решило его. Спасибо за вашу помощь

0

Просто удалите @Controller("contactDAO") из вашего ContactDAOImpl класса и изменить @Repository к @Repository("contactDAO")

0

На самом деле, кажется, у вас есть 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 аннотированным классом так весна может забрать их