springsourceフォーラムで何日か試して回答を待った後、ここで試してみます。アプリケーションを実行すると、次の例外が発生します。
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.example.my.services.user.UserService] 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)}
org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.Java:924)
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.Java:793)
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.Java:707)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:478)
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.Java:87)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:284)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1106)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:517)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:456)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:294)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:225)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:291)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:193)
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:585)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:913)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:464)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.Java:631)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.Java:588)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.Java:645)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.Java:508)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.Java:449)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.Java:133)
javax.servlet.GenericServlet.init(GenericServlet.Java:212)
org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:293)
org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:859)
org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:602)
org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:489)
Java.lang.Thread.run(Thread.Java:662)
関連するコードは次のとおりです
アプリケーションコンテキスト:
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost:5432/test" />
<property name="username" value="test" />
<property name="password" value="test" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.example.my.entities.*" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
com.example.my.entities.user:
@Entity
@Table( name = "tbl_users" )
public class User
{
@Id
@Column( name = "id" )
@GeneratedValue
private int id;
@Column( name = "username" )
private String username;
@Column( name = "password" )
private String password;
public void setId( int id )
{
this.id = id;
}
public int getId()
{
return id;
}
public void setUsername( String username )
{
this.username = username;
}
public String getUsername()
{
return username;
}
public void setPassword( String password )
{
this.password = password;
}
public String getPassword()
{
return password;
}
}
サービス:
@Service
public class UserServiceImpl implements UserService
{
@Autowired
private UserDAO userDAO;
@Override
@Transactional
public void addUser( User user )
{
userDAO.addUser( user );
}
@Override
@Transactional
public List<User> listUsers()
{
return userDAO.listUsers();
}
@Override
@Transactional
public void removeUser( int id )
{
userDAO.removeUser( id );
}
}
複数のことが原因でこの問題が発生する可能性があります。リポジトリ全体を確認する手間がかからなかったため、ここで手間をかけます。
まず、構成に注釈を使用している場合、com.example.my.services.user.UserService
の実装から注釈(@Serviceまたは@Component)が欠落している可能性があります。 (のみ)xmlを使用している場合は、UserService実装の<bean>
-definitionが欠落している可能性があります。
注釈を使用していて、実装に正しく注釈が付けられている場合は、実装が置かれているパッケージがスキャンされていることを確認してください(<context:component-scan base-package=
-valueを確認してください)。
これをapplicationContextに追加します。
<bean id="userService" class="com.example.my.services.user.UserServiceImpl ">
UserDaoクラスのヘッドにアノテーション@Repositoryを追加します。userDaoがインターフェースの場合、このアノテーションをインターフェースの実装に追加します。
AOPを使用しているため、テスト構成でも同様の問題が発生します。このコード行をspring-config.xmlに追加しました
<aop:config proxy-target-class="true"/>
そしてそれは動作します!
これがデプロイメントでのみ発生する場合は、.warで参照しているパッケージの依存関係があることを確認してください。たとえば、これは私のマシンでローカルに機能し、デバッグ構成は正常に機能していましたが、AmazonのElastic Beanstalkにデプロイした後、このエラーを受け取り、依存関係の1つが.warパッケージにバンドルされていないことに気付きました。
同様の問題がありましたが、com.example.my.services.myUser.MyUserServiceImplの実装から(@Serviceまたは@Component)が欠落していました
私の場合、これはCrudRepositoryの誤った依存関係でした。私のIDEも次のように追加されました:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.11.2.RELEASE</version>
</dependency>
しかし、私はちょうど必要:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>RELEASE</version>
</dependency>
私は最初のものを削除し、すべてが大丈夫だった。
私は同じ問題を抱えていましたが、私の場合、実装されたクラスが誤って「抽象」になり、結果として自動配線が失敗しました。