質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Java

    13815questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Spring Boot

    499questions

    Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

SpringBatchでAutowiredしたい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,709

horitaku1124

score 2

解決したいこと

SpringBatchでサンプルのプロジェクトを作成したのですが、@Autowiredのアノテーションを記述するとバッチ実行時にエラーが発生してしいまいます。
どのようにしたら解決できるかご教示いただけませんか。

エラーメッセージ

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myBatch': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.spring.repository.SampleTableRepository com.example.spring.MyBatchJob.sampleTableRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.spring.repository.SampleTableRepository] 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.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.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.example.spring.Main.main(Main.java:18)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.spring.repository.SampleTableRepository com.example.spring.MyBatchJob.sampleTableRepo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.spring.repository.SampleTableRepository] 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)
    ... 13 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.spring.repository.SampleTableRepository] 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)
    ... 15 more

該当のソースコード

MyBatchJob.java

public class MyBatchJob implements Tasklet {
    static Logger logger = Logger.getLogger("MyBatch");

    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    @Autowired
    private SampleTableRepository sampleTableRepo;

    public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
            throws Exception {
        SampleTableEntity sampleTable = new SampleTableEntity();
        sampleTable.setName("test name");
        sampleTable.setStatus(100);
        entityManager.persist(sampleTable);

        sampleTableRepo.findAll();

        System.out.println("Created SampleTableEntity=" + sampleTable.getId());
        return RepeatStatus.FINISHED;
    }
}

SampleTableRepository.java

@Repository
public interface SampleTableRepository extends JpaRepository<SampleTableEntity, Long> {}


SampleTableRepositoryImpl.java

public class SampleTableRepositoryImpl {}

applicationContext.xml

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

    <import resource="classpath:META-INF/spring/batchContext.xml"/>

    <context:component-scan base-package="com.example.spring"/>

    <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"/>

    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"
          p:jobRepository-ref="jobRepository"/>

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"
          p:driverClassName="com.mysql.jdbc.Driver"
          p:url="jdbc:mysql://localhost/spring_test?zeroDateTimeBehavior=convertToNull"
          p:username="root"
          p:password=""/>

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          p:dataSource-ref="dataSource"
          p:packagesToScan="com.example.spring"
          p:jpaVendorAdapter-ref="jpaVendorAdapter"/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>

</beans>

プロジェクト
https://github.com/horitaku1124/spring_batch_sample/tree/master/SpringBatchSample1

補足情報(言語/FW/ツール等のバージョンなど)

SpringBoot 1.5.1.RELEASE
Spring 4.0.5.RELEASE

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • november

    2017/02/15 09:23

    SampleTableRepositoryのソースもお願いします。

    キャンセル

  • horitaku1124

    2017/02/15 11:53

    後程追加編集します。

    キャンセル

回答 2

0

エラーメッセージから読めるのは
「com.example.spring.repository.SampleTableRepository」
型で定義されたBeanが見つからないため、DIに失敗しているとのことですね。

<bean id="xxxxx" class="com.example.spring.repository.SampleTableRepository">
を明示的に定義ファイルに書いてみては?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/15 11:51

    ありがとうございます。
    確認してみます。

    キャンセル

  • 2017/02/16 00:40 編集

    applicationContext.xmlに
    <bean id="sampleTableRepo" class="com.example.spring.repository.SampleTableRepository" />
    と記載したところ、
    Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.example.spring.repository.SampleTableRepository]: Specified class is an interface
    とのエラーが発生してしまいました。

    キャンセル

  • 2017/02/16 09:07

    SampleTableRepository.javaがIFなのでしょうね。

    class="com.example.spring.repository.SampleTableRepository"にはIFではなく、対象IFの実装クラスを指定すればよいかと思います。

    キャンセル

  • 2017/02/16 21:03

    applicationContext.xml を修正してみましたが、同じように NoSuchBeanDefinitionException が発生してしまいます。
    @Autowired しているのをSampleTableRepositoryImplに変えればエラーにはなりませんが、何もJPAのメソッドが呼べません。

    キャンセル

  • 2017/02/17 09:27

    public class SampleTableRepositoryImpl {}が
    public interface SampleTableRepository extends JpaRepository<SampleTableEntity, Long>を実装してないからなのでは?

    public class SampleTableRepositoryImpl implements SampleTableRepository {}かな?

    キャンセル

  • 2017/02/20 00:17

    implements をすると実装メソッドが足りないエラーが出てしまいます。

    キャンセル

  • 2017/02/20 09:15

    それは当たり前ですね。

    IFで定義したものを実装するためのimplementsですから。
    IFで定義したメソッドがよばれた際にどのような処理をするかを定義しないと。

    キャンセル

  • 2017/02/23 00:52

    HIbernateの仕様上そうではなかったはずですが、、、

    キャンセル

0

Bootのプロジェクトであれば、xmlでの定義やJpaRepositoryの実装はせずに動くはずだと思うので、自分だったらひとまずBatchを入れないプロジェクトを作ってみて、@Autowiredが動くかどうか試してみると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 00:53

    ちょっと試してみます。
    Webプロジェクトでは問題なかったので、@Autowiredを書くクラスの場所が悪いのでしょうか。

    キャンセル

  • 2017/02/23 11:50

    Webプロジェクトでは問題がなかったとすると、Batch特有のものなのだろうと思います。BatchではDBへのアクセスにItemReaderとItemWriterを使用するケースが多いようですが、その方法は試してみましたか?JpaRepositoryをAutowireするのだったら、何かワンクッションをはさむとか、工夫が必要そうですね。

    キャンセル

  • 2017/03/01 00:08

    ItemReaderとItemWriterを使用するケース を考えたのですが、プロジェクト自体作成できず進んでいません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13815questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Spring Boot

    499questions

    Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。