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

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

ただいまの
回答率

89.19%

Java SpringBootで、MultipartFileクラスを使いDBに画像を保持する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 532

haru_usami

score 6

やりたい事

MultipartFileクラスを使うと保持できると知り、JPAを使ってデータベースに画像を保存させて見たく試しているところです。
しかし、org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resourceというエラーが発生し止まってしまっている状態です。

調べた事

entityManagerFactory のエラーが出る場合という事で、https://qiita.com/syunchanp/items/a3be70ca10af18c2db26を参考にさせて頂きましたが、importも間違っていないようでした。

パッケージの管理がおかしいのか、JPAの仕様がそもそもMultipartFileができないのか、Bean保持ができていないのか。
どうか原因と訂正についてご教授ください。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>Image_Upload_Test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Image_Upload_Test</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>
spring.datasource.url=jdbc:mysql://localhost:3306/sampledb
spring.datasource.username=root
spring.datasource.password=XXX
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.jpa.database=MYSQL
spring.jpa.hibernate.ddl-auto=update
logging.level.org.springframework.web = trace
package com.example.demo.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.springframework.web.multipart.MultipartFile;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class FileUploadForm {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private MultipartFile fileData;


}
ackage com.example.demo.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.demo.domain.FileUploadForm;
import com.example.demo.service.HomeService;



@Controller
public class HomeController {
    @Autowired
    private HomeService homeService;

    @RequestMapping("/a")
    public String index() {
        return "index";
    }

    @PostMapping(value = "/upload")
    public String create(@ModelAttribute FileUploadForm file) { 
        homeService.save(file);
        return "redirect:/index"; 
    }
}
package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;

import com.example.demo.domain.FileUploadForm;
import com.example.demo.repository.HomeRepository;

public class HomeService {

    @Autowired
    private HomeRepository homeRepository;
    public FileUploadForm save(FileUploadForm form) {

        return homeRepository.save(form);
    }
}
package com.example.demo.repository;


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

import com.example.demo.domain.FileUploadForm;

@Repository
public interface HomeRepository extends JpaRepository<FileUploadForm, Long> {
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data" th:action="@{/upload}">
        <input name="fileData" type="file" />
        <input type="submit" />
    </form>
</body>
</html>

エラー内容
rror starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-09-17 18:09:46.821 ERROR 5041 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: org.springframework.web.multipart.MultipartFile, at table: file_upload_form, for columns: [org.hibernate.mapping.Column(file_data)]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • rubytomato

    2019/09/18 20:03

    FileUploadFormクラスにEntityアノテーションが付いていますが、このエンティティクラスに対応するテーブルのcreate table文を質問内容に追記してください。

    キャンセル

回答 1

checkベストアンサー

0

Entityに、MultipartFile型は使用できなかったと思います
byte[](か、Byte[])に変換すれば動くのではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/18 10:17

    ご回答ありがとうございます。
    Entityのフィールドの型を、MultipartFileからByte[],byte[]に変更したところ、Field homeService in com.example.demo.controller.HomeController required a bean of type 'com.example.demo.service.HomeService' that could not be found.

    とエラーが出ました。コントローラーとサービスのbeanの型が合わないとの事だと思いますが、型はEntityクラスの型指定していますのでそうなる理由がわからないです。。。

    キャンセル

  • 2019/09/19 01:13

    回答が遅くなり申し訳ございません
    以前同様のシステムを作ったことがありますが、
    コントローラでファイルを受け取る際のFormクラスはMultipartFileである必要があり
    それとは別にentity用のデータクラスを作成し、そちらをbyte[]にすれば動作をしたと思います

    キャンセル

  • 2019/09/19 13:10

    ありがとうございます!本当に感謝です!

    キャンセル

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

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