Ich versuche, einen SOAP - Dienst mithilfe von Spring zu schreiben, jedoch erhalte ich ein Problem mit der Abhängigkeit von Abhängigkeiten. Ich habe Probleme bei der Verwendung von @Autowired
durch den Dienst wie folgt:
public interface UserDao {
User getUser(String username);
}
Implementierung für Dao wie folgt:
@Controller("userDao")
public class UserDaoImpl implements UserDao {
private static Log log = LogFactory.getLog(UserDaoImpl.class);
@Autowired
@Qualifier("sessionFactory")
private LocalSessionFactoryBean sessionFactory;
@Override
public User getUser(String username) {
Session session = sessionFactory.getObject().openSession();
// Criteria query = session.createCriteria(Student.class);
Query query = session
.createQuery("from User where username = :username");
query.setParameter("username", username);
try {
System.out.println("\n Load Student by ID query is running...");
/*
* query.add(Restrictions.like("id", "%" + id + "%",
* MatchMode.ANYWHERE)); return (Student) query.list();
*/
return (User) query.uniqueResult();
} catch (Exception e) {
// TODO: handle exception
log.info(e.toString());
} finally {
session.close();
}
return null;
}
}
und
public interface UserBo {
User loadUser(String username);
}
und
public class UserBoImpl implements UserBo {
@Autowired
private UserDao userDao;
@Override
public User loadUser(String username) {
// TODO Auto-generated method stub
return userDao.getUser(username);
}
}
@WebService
@Component
public class UserService {
@Autowired
private UserBo userBo;
@WebMethod(operationName = "say")
public String sayHello(String name) {
return ("Hello Java to " + name);
}
@WebMethod(operationName = "getUser")
public User getUser(String username) {
return userBo.loadUser(username);
}
}
Das Folgende ist eine XML-Zuordnungsdatei
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.Java.net/spring/core"
xmlns:wss="http://jax-ws.dev.Java.net/spring/servlet"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://jax-ws.dev.Java.net/spring/core
http://jax-ws.Java.net/spring/core.xsd
http://jax-ws.dev.Java.net/spring/servlet
http://jax-ws.Java.net/spring/servlet.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:annotation-config />
<context:component-scan base-package="edu.Java.spring.ws"></context:component-scan>
<context:component-scan base-package="edu.Java.spring.ws.dao"></context:component-scan>
<bean id="userDao" class="edu.Java.spring.ws.dao.UserDaoImpl"></bean>
<!-- <context:component-scan base-package="edu.Java.spring.ws.bo"></context:component-scan>
-->
<wss:binding url="/user">
<wss:service>
<ws:service bean="#userService" />
</wss:service>
</wss:binding>
<bean id="userBo" class="edu.Java.spring.ws.bo.impl.UserBoImpl"></bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/contentdb" />
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="packagesToScan" value="edu.Java.spring.ws.model" />
</bean>
</beans>
Und der Fehler bei der Bereitstellung ist: Hier ist der aktualisierte Stack-Trace:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.Sun.xml.ws.transport.http.servlet.SpringBinding#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot create inner bean '(inner bean)#538071ba' of type [org.jvnet.jax_ws_commons.spring.SpringService] while setting bean property 'service'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#538071ba' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'userService' while setting bean property 'bean'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.bo.UserBo edu.Java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.dao.UserDao edu.Java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] 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)}
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.Java:290)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.Java:129)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.Java:1456)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1197)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:482)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.Java:403)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.Java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.Java:106)
at org.Apache.catalina.core.StandardContext.listenerStart(StandardContext.Java:4992)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5490)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1575)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1565)
at Java.util.concurrent.FutureTask.run(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at Java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#538071ba' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'userService' while setting bean property 'bean'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.bo.UserBo edu.Java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.dao.UserDao edu.Java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] 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)}
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.Java:336)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.Java:108)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.Java:1456)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1197)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.Java:276)
... 24 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.bo.UserBo edu.Java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.dao.UserDao edu.Java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] 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)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:195)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.Java:328)
... 30 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.bo.UserBo edu.Java.spring.ws.UserService.userBo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.dao.UserDao edu.Java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] 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)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.Java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:289)
... 38 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.dao.UserDao edu.Java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] 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)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.Java:1017)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.Java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.Java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:480)
... 40 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private edu.Java.spring.ws.dao.UserDao edu.Java.spring.ws.bo.impl.UserBoImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] 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)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.Java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:289)
... 51 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] 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)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.Java:1103)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.Java:963)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.Java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:480)
... 53 more
Schau dir die Ausnahme an:
No qualifying bean of type [edu.Java.spring.ws.dao.UserDao] found for dependency
Dies bedeutet, dass keine Bean verfügbar ist, um diese Abhängigkeit zu erfüllen. Ja, Sie haben eine Implementierung der Schnittstelle, aber Sie haben noch keine Bean für diese Implementierung erstellt. Sie haben zwei Möglichkeiten:
UserDaoImpl
mit @Component
oder @Repository
und lassen Sie den Komponentenscan die Arbeit für Sie erledigen, genau wie Sie dies mit UserService
getan haben.UserBoImpl
getan haben.Denken Sie daran, dass Sie die Definition vor dem Komponentenscan vorlegen müssen, wenn Sie die Bean explizit erstellen. In diesem Fall ist die Reihenfolge wichtig.
Fügen Sie der Implementierung von UserDaoImpl
die Anmerkung @Repository
hinzu.
@Repository
public class UserDaoImpl implements UserDao {
private static Log log = LogFactory.getLog(UserDaoImpl.class);
@Autowired
@Qualifier("sessionFactory")
private LocalSessionFactoryBean sessionFactory;
//...
}
Ihnen scheint die Implementierung für die Benutzeroberfläche UserDao zu fehlen. Wenn Sie die Ausnahme genau betrachten, heißt es
Keine qualifizierende Bean vom Typ [edu.Java.spring.ws.dao.UserDao] für .__ gefunden. Abhängigkeit:
Die Funktionsweise von @Autowired
besteht darin, dass automatisch nach der Implementierung einer Abhängigkeit gesucht wird, die Sie über eine Schnittstelle einfügen. Da in diesem Fall keine gültige Implementierung der Schnittstelle UserDao vorliegt, wird der Fehler angezeigt. Stellen Sie sicher, dass Sie über eine gültige Implementierung für diese Klasse verfügen und Ihr Fehler sollte behoben sein.
Hoffentlich hilft das.
Ich habe @Service
vor der Impl-Klasse hinzugefügt und der Fehler ist weg.
@Service
public class FCSPAnalysisImpl implements FCSPAnalysis
{}
Wir sind mit diesem Problem konfrontiert, hatten aber einen anderen Grund, hier ist der Grund:
In unserem Projekt wurden mehrere Bean-Einträge mit demselben Bean-Namen gefunden. 1 in applicationcontext.xml & 1 in dispatcherServlet.xml
Beispiel:
<bean name="dataService" class="com.app.DataServiceImpl">
<bean name="dataService" class="com.app.DataServiceController">
& Wir versuchen, den DataService-Namen automatisch zu verwenden.
Lösung: Wir haben den Bean-Namen und seine Lösung geändert.
In meinem Fall wird der Anwendungskontext nicht geladen, weil ich die @DataJpaTest
-Annotation hinzufüge. Wenn ich es in @SpringBootTest
ändere, funktioniert es.
@DataJpaTest
lädt nur den JPA-Teil einer Spring Boot-Anwendung. Im JavaDoc:
Anmerkung, die in Kombination mit
@RunWith(SpringRunner.class)
für einen typischen JPA-Test verwendet werden kann. Kann verwendet werden, wenn ein Test only auf JPA-Komponenten fokussiert . Durch die Verwendung dieser Anmerkung wird die vollständige automatische Konfiguration deaktiviert und stattdessen nur die für JPA-Tests relevante Konfiguration angewendet.Standardmäßig verwenden Tests, die mit
@DataJpaTest
versehen sind, eine eingebettete In-Memory-Datenbank (die explizite oder normalerweise automatisch konfigurierte DataSource ersetzt). Mit der Annotation@AutoConfigureTestDatabase
können diese Einstellungen überschrieben werden. Wenn Sie Ihre vollständige Anwendungskonfiguration laden möchten, aber eine eingebettete Datenbank verwenden, sollten Sie@SpringBootTest
in Kombination mit@AutoConfigureTestDatabase
anstelle dieser Anmerkung in Betracht ziehen.
In meinem Fall musste ich die Annotation @Service
von der Schnittstelle in die Implementierungsklasse verschieben.
Fügen Sie vor Ihrer DAO-Implementierungsklasse eine Repository-Annotation hinzu. _. Beispiel:
@Repository
public class EmpDAOImpl extends BaseNamedParameterJdbcDaoSupportUAM
implements EmpDAO{
}
Ich habe es versäumt, hinzuzufügen
@Controller("userBo") into UserBoImpl class.
Die Lösung hierfür ist das Hinzufügen dieses Controllers in die Impl-Klasse.