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

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

ただいまの
回答率

90.01%

Spring Bootのエラーの解決策がわかりません

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 12K+

Hiroaki-Yamada

score 11

Ecripseを使ってSpring Bootプログラミング入門という参考書をすすめているのですが、

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloController': Injection of autowired dependencies failed;nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.yamada.springboot.MyDataRepository com.yamada.springboot.HelloController.repository;No bean named 'entityManagerFactory' is defined

というエラーが出て困っています。
社内にSpringがわかる人がいないため、どなたかわかる方がいらっしゃいましたらご教授お願いいたします。念のため、コードも載せます。

ちなみに、Spring Bootのバージョンは1.3.6で文字コードはutf-8です。

package com.yamada.springboot;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(name="mydata")
public class MyData {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column
    @NotNull
    private long id;

    @Column(length = 50, nullable = false)
    @NotEmpty
    private String name;

    @Column(length = 200, nullable = true)
    @Email
    private String mail;

    @Column(nullable = true)
    @Min(0)
    @Max(200)
    private Integer age;

    @Column(nullable = true)
    private String memo;

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getMail() {
        return mail;
    }
    public void setMail(String mail) {
        this.mail = mail;
    }

    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
}
package com.yamada.springboot.repositories;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.yamada.springboot.MyData;

@Repository
public interface MyDataRepository  extends JpaRepository<MyData, Long> {

    public MyData findById(Long name);
    public List<MyData> findByNameLike(String name);
    public List<MyData> findByIdIsNotNullOrderByIdDesc();
    public List<MyData> findByAgeGreaterThan(Integer age);
    public List<MyData> findByAgeBetween(Integer age1, Integer age2);

}
package com.yamada.springboot;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.yamada.springboot.repositories.MyDataRepository;

@Controller
public class HelloController {

    @Autowired
    MyDataRepository repository;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView index(
        @ModelAttribute("formModel") MyData mydata,
            ModelAndView mav) {
        mav.setViewName("index");
        mav.addObject("msg","this is sample content.");
        mav.addObject("formModel",mydata);
        Iterable<MyData> list = repository.findAll();
        mav.addObject("datalist",list);
        return mav;
    }

    @RequestMapping(value = "/", method = RequestMethod.POST)
    @Transactional(readOnly=false)
    public ModelAndView form(
            @ModelAttribute("formModel")
            @Validated MyData mydata,
            BindingResult result,
            ModelAndView mov) {
        ModelAndView res = null;
        if (!result.hasErrors()){
            repository.saveAndFlush(mydata);
            res = new ModelAndView("redirect:/");
        } else {
            mov.setViewName("index");
            mov.addObject("msg","sorry, error is occured...");
            Iterable<MyData> list = repository.findAll();
            mov.addObject("datalist",list);
            res = mov;
        }
        return res;
    }

    @PostConstruct
    public void init(){
        MyData d1 = new MyData();
        d1.setName("tuyano");
        d1.setAge(123);
        d1.setMail("syoda@tuyano.com");
        d1.setMemo("this is my data!");
        repository.saveAndFlush(d1);
        MyData d2 = new MyData();
        d2.setName("hanako");
        d2.setAge(15);
        d2.setMail("hanako@flower");
        d2.setMemo("my girl friend.");
        repository.saveAndFlush(d2);
        MyData d3 = new MyData();
        d3.setName("sachiko");
        d3.setAge(37);
        d3.setMail("sachico@happy");
        d3.setMemo("my work friend...");
        repository.saveAndFlush(d3);
    }

    @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
    public ModelAndView edit(@ModelAttribute MyData mydata,
            @PathVariable int id,ModelAndView mav) {
        mav.setViewName("edit");
        mav.addObject("title","edit mydata.");
        MyData data = repository.findById((long)id);
        mav.addObject("formModel",data);
        return mav;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    @Transactional(readOnly=false)
    public ModelAndView update(@ModelAttribute MyData mydata,
            ModelAndView mav) {
        repository.saveAndFlush(mydata);
        return new ModelAndView("redirect:/");
    }

    @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
    public ModelAndView delete(@PathVariable int id,
            ModelAndView mav) {
        mav.setViewName("delete");
        mav.addObject("title","delete mydata.");
        MyData data = repository.findById((long)id);
        mav.addObject("formModel",data);
        return mav;
    }

    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    @Transactional(readOnly=false)
    public ModelAndView remove(@RequestParam long id,
            ModelAndView mav) {
        repository.delete(id);
        return new ModelAndView("redirect:/");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yamada.springboot</groupId>
    <artifactId>MyBootApp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>MyBootApp</name>
    <description>Sample project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <start-class>org.springframework.boot.SpringApplication</start-class>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


以上になります。よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

check解決した方法

0

本の著者でも解決策はわからないようなので、未解決ですがクローズします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/20 08:51

    手順通りやってできないはずがないから(間を飛ばしたんだろう)てことかと

    キャンセル

0

SpringBootと言うよりも、mavenの問題でしょうか。

C:/Users/UserName/.m2/repository/org/hibernate/hibernate-core/4.3.11.Final/hibernate-core-4.3.11.Final.jar を読み込もうとして失敗してしまったようです。

一度、C:/Users/UserName/.m2/repository/org/hibernate/hibernate-core/ ディレクトリを削除した後にEclipseを再起動して、mavenから再取得した方が良いでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/06 11:04

    ご回答ありがとうございます。
    hsqldbの接続がわからなかったので、以前作成したmysqlに接続したのですがエラー内容が変わらなかったです。

    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost/servletschedule
    spring.datasource.username=scheduleuser
    spring.datasource.password=schedulepass
    spring.datasource.name=servletschedule

    キャンセル

  • 2016/07/06 12:37

    application.propertiesは既存のファイルを使用していますよね?
    (問題ないとは思いますが念のため:src/main/resources/application.properties )

    キャンセル

  • 2016/07/06 12:59

    はい、既存のsrc/main/resources/application.propertiesを利用しています。

    キャンセル

0

データベースの設定がぬけているのもたしかなんですが....
この本Spring Bootプログラミング入門はなんかうまく動作しないとかいてありました。
amazonの評価で。
一度正誤表を見たり、出版社に聞いてみたらいかがですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/06 15:14

    spring tool suiteについて説明が記載されていたのですが、各画面の説明のみで、
    データベースについては記載されていませんでした。
    プログラムについては、自分で書いて動かなかったので、サポートページからダウンロードしものをコピペしました。それでも動きませんでした。

    キャンセル

  • 2016/07/06 15:56

    返品できます?
    そこまでくるとだめですね
    ほかにも一人いるということはたぶんHiroaki-Yamadaさんが
    間違っているとは思えないんですよね。
    たぶん、一か所なおしてもエラーがまだまだでそうな予感....
    ほかの本やサイトで勉強したほうがよいと思います。

    キャンセル

  • 2016/07/06 16:13

    今日の午前中に、出版社にエラー内容を送信してみました。
    お昼過ぎに確認したところ、著者に報告したとのことでした。
    著者からの回答待ちですが、いまのところ音沙汰ないので返事は期待しておりません。
    エラー内容をググってみると、xmlにdatasouceやらbeanやら設定するらしいですが、
    その辺の説明もないです。
    最悪、ほかの本でいちからやってみようかと思います。

    キャンセル

0

エラーメッセージは、「EntityManagerFactoryのBeanクラスがないので、HelloControllerへのインジェクションに失敗した」と言っていますね。

EntityManagerFactoryはSpring JPAのクラスですので、Spring Data JPAに関する設定をapplication.propertiesに記述する必要があります。

application.propertiesにこのあたりを追記してみてはどうでしょう。
(値はDBの種類によって変えてください)

spring.jpa.hibernate.ddl-auto: create-drop
spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.database: H2
spring.jpa.show-sql: true

参考:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/06 17:17

    ご回答ありがとうございます。
    上記サイトを参考にして、下のコードを追記してみたのですが変わらずでした。

    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    spring.jpa.database=MYSQL
    spring.jpa.show-sql=true

    キャンセル

0

「Spring Bootのバージョンは1.3.6」の環境が無いので、
STS3.8.2にて「spring-boot-starter-parent1.4.3.RELEASE」の環境で、
Hiroaki-Yamadaさんのコードを動かす事が出来ましたので、報告しておきます。

  1. 「Spring スターター・プロジェクト」で、プロジェクトを作成。

  2. Hiroaki-Yamadaさんのコードを配置。

  3. 「public class HelloController 」ですが、本来は、
    「public class HeloController」です。
    誤り:Hello、正:Helo。
    STS3.8.2では、エラーメッセージが出るので、この手の間違いは、すぐに分かるのですが、
    もしかしたら、当時は、気が付かずに、あらぬ、方向へ行ってしまったのかもしれませんね。

  4. DB接続については、pom.xmlにて

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
        </dependency>


記述にて、
@Autowired
MyDataRepository repository;

の元、

Iterable<MyData> list = repository.findAll();
と、
public interface MyDataRepository  extends JpaRepository<MyData, Long>内の
MyData data = repository.findById((long)id);
等が、有効化され、hsqldbとの接続がなされます。

p.s.
この手のサンプルコードが、一度で、旨く動いたためしはなく、間違い探しや、環境の構築の繰り返しの日々です。

最悪、ほかの本でいちからやってみようかと思います。


ですが、本書の5章までは、間違いは無く、小生の手元では、動いています。
なぜ5章までかというと、、、PostgeSQLとSQLite3との接続確認を優先したためで、
6章に入ったところで、本投稿を見つけて、検証し、結果を書き込んだ次第です。

あと、pom.xmlを修正したら
maven、プロジェクトの更新
run、clear
run、install
をして、spring boot jar の依存関係を都度更新しないと、こういったエラーが出まくりました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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