1. ホーム
  2. java

[解決済み] 自動配線された依存関係のインジェクションに失敗、フィールドを自動配線できなかった

2022-02-19 22:55:47

質問

この質問は何度もされているので、2重(または3重、4重)の話題になる危険性がありますが、提案された解決策は私には効果がないようです。

cannot autowire エラーという恐ろしいエラーに悩まされています。初めて完全なSpringプロジェクトをゼロからセットアップしたので、問題が何であるかがよくわかりません。

これが私の現在の設定です。 ProjectRepoです。

package be.italent.repo;

import be.italent.model.Project;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProjectRepo extends JpaRepository<Project, Integer> {

}

ProjectServiceです。

package be.italent.services;

import be.italent.model.Project;
import be.italent.repo.ProjectRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ProjectService {

    @Autowired
    private ProjectRepo projectRepo;

    public List<Project> getAllProjects() {
        return projectRepo.findAll();
    }
}

ProjectRestControllerです。

package be.italent.controllers;

import java.util.ArrayList;
import be.italent.services.ProjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import be.italent.model.Project;

@RestController
@RequestMapping("/projects")
public class ProjectRestController {

    @Autowired
    private ProjectService projectService;

    @RequestMapping(method = RequestMethod.GET, produces="application/json")
    public ArrayList<Project> getProjects(){
        ArrayList<Project> c = (ArrayList<Project>) projectService.getAllProjects();

        return c;
    }
}

spring-mvc.xml

...
<context:component-scan base-package="be.italent"></context:component-scan>
...

エラーです。

SEVERE: org.springframework.web.context.ContextLoaderListener クラスのリスナーインスタンスにコンテキスト初期化イベントを送信する例外が発生しました。 org.springframework.beans.factory.BeanCreationException: 名前 'projectRestController' を持つ Bean の作成に失敗しました。自動化された依存関係の注入に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException.Injection of autowired dependencies です。ネストした例外は org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.services.ProjectService be.italent.controllers.ProjectRestController.projectService; org.springframework.beans.factory.BeanCreationException.ProjectService は、ネストした例外が発生します。名前 'projectService' を持つ Bean の作成に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException.Injection of autowired dependencies failed である。また、このような場合にも、「BeanCreationException」を使用します。この依存関係のための autowire 候補として修飾される少なくとも 1 つの bean が期待されます。依存関係のアノテーション。{を使用することで、[bealent.beans.factory.annotation.Autowired(required=true)}を使用することができます。 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 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.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 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:5068) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1572) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1562))です。 at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) 原因: org.springframework.beans.factory.BeanCreationException: 原因: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private be.italent.services.ProjectService be.italent.controllers.ProjectRestController.projectService; nested exception is org.springframework.beans.factory.BeanCreationException: 名前 'projectService' を持つ Bean の作成に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException.Injection of autowired dependencies failed である。また、"Could not autowire field: private be.italent.repo.ProjectRepo be.italent.services.ProjectService.projectRepo; nested exception is org.springframework.beans.factory.NoSu" と表示されることもあります。

何かお手伝いできることはありますか?ありがとうございます。

解決方法

spring-mvc.xmlにこれを追加しました。

<beans
...
jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

...

<jpa:repositories base-package="be.italent.repo" entity-manager-factory-ref="emf"/>

解決方法は?

アプリケーションコンテキストの初期化時に何か問題が発生すると、Springはしばしばこのような長いスタックトレースを表示します。通常、スタックトレースの一番下を見れば、最終的な原因が何なのかが分かります。

あなたの場合、一番下にこのようなエラーメッセージが表示されていますね。

<ブロッククオート

org.springframework.beans.factory.NoSuchBeanDefinitionException.NoSuchBeanDefinitionException.NoSuchBeanDefinitionException: タイプ [be.italent.repo.ProjectRepo] の修飾された bean は見つかりませんでした。

これは、Springが以下のタイプのBeanを見つけることができないことを意味します。 ProjectRepo .

あなたの ProjectRepo リポジトリインターフェースは、パッケージ be.italent.repo のサブパッケージである be.italent そのため、間違ったパッケージに入っていることが問題なのではありません。

Spring Data JPAを有効にするのを忘れていませんか?

XML 設定を使用する場合(今やっているように)には、その前に repositories XMLタグを設定ファイル内に記述します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jpa="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">

    <!-- Tell Spring Data JPA where your repository interfaces are -->
    <jpa:repositories base-package="be.italent.repo" />

    <!-- ... -->
</beans>

JavaConfigを使用する場合は、アノテーションで行うことができます。

@Configuration
@EnableJpaRepositories("be.italent.repo")
public class MySpringConfiguration {
    // ...
}