1

Spring Data JPAを使用して、 <repositories />を使用して DAO オブジェクトを自動的に生成しようとしています。ベースパッケージは、次のような DAO インターフェイスを含むパッケージにリンクしています。

public interface UserDAO extends JpaRepository<User, String> {
}

しかし、サービス Bean での DAO オブジェクトの接続に失敗します。正確なエラーは次のとおりです。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ACLService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private pkg.service.UserServ pkg.service.ACLServ.userServ; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServ': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private pkg.repositories.UserDAO pkg.service.UserServ.userDAO; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [pkg.repositories.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:287)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at pkg.config.WebAppInit.onStartup(WebAppInit.java:35)

アプリケーションのブートストラップは、WebApplicationInitializer インターフェイスを実装しているため、 WebAppInit.Javaで開始します。web.xml コードは次のとおりです。

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"></web-app>

WebAppInit.Javaは onStartup メソッドを次のようにコーディングします。

public class WebAppInit implements WebApplicationInitializer {
public void onStartup(ServletContext container) throws ServletException {
    AnnotationConfigWebApplicationContext context  = 
        new AnnotationConfigWebApplicationContext();
    context.register(ApplicationContextConfig.class);
    context.refresh();
    ...

次に、ApplicationContextConfigクラスに @Configuration のアノテーションが付けられます。コードは次のとおりです。

@Configuration
@PropertySource("classpath:application.properties")
@ImportResource("classpath:*springDataConfig.xml")
@Import({BasicDataSourceConfig.class,PersistenceSpringDataJpaConfig.class})
@ComponentScan(basePackages={"pkg.service","pkg.utils"})
public class ApplicationContextConfig {
}

したがって、これは Java 構成のメイン/エントリ ポイントにすぎず、次にapplication.properties (含まれていませんが、要求するだけです)、コード付きのspringDataConfig.xmlに従います。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.springframework.org/schema/data/jpa"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

  <repositories base-package="pkg.repositories" />

</beans:beans>

BasicDataSourceConfig.Javaは、DataSource @Bean を次のように構成します

@Bean
public DataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    ...

PersistenceSpringDataJpaConfig.JavaはLocalContainerEntityManagerFactoryBeanを次のように構成します。

@Configuration
public class PersistenceSpringDataJpaConfig {
    ...

    @Autowired
    DataSource dataSource;

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    ...

コードを削除/コメントして依存関係を切り離した場合、他のファイルは直接関連していません。

@Autorire 
private UserDAO userDAO

UserService クラスで。アプリケーションはエラーなしで実行されます。つまり、サービス Bean で dao オブジェクトにアクセスするときのヌル ポインター例外以外は意味します。

問題は、Spring Data JPA が userDAO Bean を作成しないのはなぜですか?

PS: すべての @Transactions 管理を意図的に取り除いて簡素化しましたが、トランザクションがなくても動作するはずですよね?

4

0 に答える 0