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

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

ただいまの
回答率

90.04%

EntityManagerの初期化はできているが検索メソッドが呼ばれない

解決済

回答 8

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,691

Linkey

score 41

DAOクラスから特定のテーブルを検索するメソッドを実装して動かしているのですが検索メソッド(findAllPreUserId)が呼ばれません。System.out.printを使ってどこまで処理が動いているのか確認したところEntityManagerの初期化はできていそうに見えます。(もしできていなければ「PersisitenceExceptionで「Unable to build Hibernate SessionFactory」という趣旨のエラーが発生する認識です。)

実際に動かしてみるとコンソールは以下のようになります。
イメージ

影響ありそうな箇所は確認しましたが特に設定ミス等はなさそうなのですが、JPA、Hibernateにお詳しい方がいましたら、ご回答をお願いいたします。

DAOクラス

package registration.dao;

import java.io.Closeable;
import java.io.IOException;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import registration.entity.PreUserEntity;
import util.dao.ResourceDAO;

/**
 * 仮ユーザーテーブルにアクセスする
 *
 * @author user
 *
 */
public class PreUserDAO implements Closeable, ResourceDAO {

    final static String COMPLETED = "Comleted";
    private final static String SQL_FIND_ALL_PRE_COSTOMER_ID = "PreUser.findAllPreCostomerId";

    EntityManager em = null;
    EntityTransaction et = null;

    public PreUserDAO() {
        System.out.println("entityManagerの設定");
        em = Persistence.createEntityManagerFactory("restaurant").createEntityManager();
    }

    /**
     * 仮ユーザーテーブルにレコードを挿入します
     *
     * @param preCostomerId
     */
    @Override
    public void insert(String preCostomerId, String processName) {
        //TODO 未実装
    }


    //仮ユーザIDを検索して取得します
    public void findAllPreUserId() {
        System.out.println("検索を始めます");
        List<PreUserEntity> entity = em.createQuery(SQL_FIND_ALL_PRE_COSTOMER_ID, PreUserEntity.class).getResultList();

        if (entity.size() != 0) {
            System.out.println("検索成功");
        } else {
            System.out.println("検索失敗");
        }
        em.close();
    }

    @Override
    public void close() throws IOException {
        if (em != null) {
            em.close();
        }
    }
}

Entityクラス

package registration.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;

/**
 * The persistent class for the pre_user database table.
 *
 */
@Entity
@Table(name = "pre_user")
@NamedQueries({
    @NamedQuery(name = "PreUser.findAllPreUserId", query = "SELECT p FROM pre_user p"),
    @NamedQuery(name = "PreUser.findAllPreCostomerId", query = "SELECT NEW registration.entity.PreUserEntity (p.preCustomerId) FROM pre_user p")
})

public class PreUserEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="pre_customer_id")
    private String preCustomerId;

    @Column(name="process_name")
    private String processName;

    @Column(name="process_status")
    private String processStatus;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="register_time")
    private Date registerTime;

    @Column(name="register_user")
    private String registerUser;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="update_time")
    private Date updateTime;

    @Column(name="update_user")
    private String updateUser;

    public PreUserEntity() {
    }

    public PreUserEntity(String preCostomerId) {
        this.preCustomerId = preCostomerId;
    }

    public String getPreCustomerId() {
        return this.preCustomerId;
    }

    public void setPreCustomerId(String preCustomerId) {
        this.preCustomerId = preCustomerId;
    }

    public String getProcessName() {
        return this.processName;
    }

    public void setProcessName(String processName) {
        this.processName = processName;
    }

    public String getProcessStatus() {
        return this.processStatus;
    }

    public void setProcessStatus(String processStatus) {
        this.processStatus = processStatus;
    }

    public Date getRegisterTime() {
        return this.registerTime;
    }

    public void setRegisterTime(Date registerTime) {
        this.registerTime = registerTime;
    }

    public String getRegisterUser() {
        return this.registerUser;
    }

    public void setRegisterUser(String registerUser) {
        this.registerUser = registerUser;
    }

    public Date getUpdateTime() {
        return this.updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public String getUpdateUser() {
        return this.updateUser;
    }

    public void setUpdateUser(String updateUser) {
        this.updateUser = updateUser;
    }

}

呼び出し元のビジネスロジッククラス

package registration.business_logic;

import java.io.IOException;
import java.util.Random;

import registration.dao.PreUserDAO;

public class RegistrationBusinessLogic {
    PreUserDAO dao = null;
    public void gettingPreUserIdFromDatabase() throws IOException {
        try {
            dao = new PreUserDAO();
            System.out.println("仮会員テーブルを検索します");
            dao.findAllPreUserId();
        } finally {
            dao.close();
        }
    }
}

コントローラー

package registration.controller;

import java.util.logging.Logger;

import org.apache.logging.log4j.LogManager;

import registration.business_logic.RegistrationBusinessLogic;

public class RegistrationController {
    static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Logger.class.getName());
    private RegistrationBusinessLogic logic = null;

    public RegistrationController(){

    }
    //ここで例外処理を行う
    public void invoke(String process_code){

        try {
            //DAOクラスを呼び出す
                //まずは仮会員IDを発番させる
                logic = new RegistrationBusinessLogic();
                logic.gettingPreUserIdFromDatabase();
                System.out.println("テーブル検索が完了しました");

        } catch (Exception e) {
            //TODO 未実装
        }
    }

}

persistence..xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

  <!-- MySQL + TOMCAT-->
  <persistence-unit name="restaurant" transaction-type="RESOURCE_LOCAL">
      <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
    <!-- DAOS -->
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
      <property name="javax.persistence.jdbc.url"    value="jdbc:mysql://localhost:3306/restaurant?useSSL=false" />
      <property name="javax.persistence.jdbc.user" value="administrator" />
      <property name="javax.persistence.jdbc.password" value="password" />
    <!-- Configuration-->
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.format_sql" value="true"/>
      <property name="hibernate.archive.autodetection" value="class"/>
    </properties>
  </persistence-unit>

    <!-- JUnit MYSQL -->
      <!--
    <persistence-unit name="restaurant">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
        <property name="hibernate.connection.release_mode" value="after_transaction"/>
        <property name="hibernate.connection.username" value="administrator"/>
        <property name="hibernate.connection.password" value="password"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/restaurant?useSSL=false"/>
    </properties>
    </persistence-unit>
    -->
</persistence>

※以下のクラスを作成したところ、エラーを出しつつ、
Daoクラスの検索処理からロジック処理に戻ってきたことを確認できました。
新規作成クラス:
イメージ説明

DaoクラスのfindAllPreUserIdメソッドを以下のように修正
イメージ説明
実行後のコンソール
イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Linkey

    2017/06/16 00:57

    EmProviderクラスの実装画像を差し替えました。見にくい場合はご連絡ください

    キャンセル

  • Linkey

    2017/06/24 08:35 編集

    エラーの原因を確認してみたところEmProviderクラスのif(emf.isOpen() || emf != null) {...}の部分でNullPointerExceptionが発生していることを確認しました。このif文をさらに分解してみたところemf.isOpen() が原因でした。emfの設定でpersistence.xmlから設定取得がどうもうまくいっていないです。persistene.xmlは次のパスに配置しています。
    「/java-restaurant/src/main/resources/META-INF/persistence.xml」

    キャンセル

  • Linkey

    2017/06/25 17:18 編集

    申し訳ありません。ページが見づらくなったため一旦、新しく質問スレッドを立てます。

    キャンセル

回答 8

0

コンストラクタPreUserDAOで止まってしまっているように見えます。

em = Persistence.createEntityManagerFactory("restaurant").createEntityManager();


ここで何らかのエラーが発生して、catch句に引っかからずに
エラーログが出ないのでは…?
まずcatch句でエラーログを吐かせるのが解決への近道かと思います。

※補足
EntityManagerのInject方法
EntityManagerをDIする方法もあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/21 01:16

    アドバイスありがとうございます。try-catch句で囲んで実行したところ「No Persistence provider for EntityManager named restaurant」というエラーが出力されました。解決方法を調べて、調べた対処方法をやりましたがエラーの解決ができません。persistence.xmlにunit-nameを指定したにもかかわらず何故かこのエラーが発生してしまいます。お詳しい方がいましたらコメントをお願いいたします。

    キャンセル

0

persistence.xmlのproviderを

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>


に統一する形ではダメでしょうか?
根拠

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/25 23:39

    コメントありがとうございます。ご指摘いただいた通りに統一してみたところ
    "検索を始めます"まではコンソールに出力できたのですが、やはりcreateQueryのところで「No Persistence provider for EntityManager named restaurant」が発生してしまいます。解決方法は調査中です。Hibernateってやはり難しいですね。

    キャンセル

0

persistence.xml

<persistence-unit name="restaurant"></persistence-unit>


までの項目が2つ記述されていることが原因ということはないでしょうか。
他の例を調べてみても同じ名前で設定を書いているところはなかったので...。
http://d.hatena.ne.jp/m-prog/20120404/1333473319

persistence.xmlはMETA-INFの直下でしょうか?
他に原因として挙げられているのは依存関係(pom.xml)で
EclipseLink
hibernate-entitymanager.jar
が足りないとかですね。

同じ環境を作れないのであくまで調べた結果からの推測になってしまいますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/03 16:59

    最新の内容に更新いたしました。

    キャンセル

  • 2017/06/03 17:06

    「No Persistence provider for EntityManager named restaurant…」以下のエラーログを詳細に記載していただけると助かります。
    一説にはpersitence.xmlの絶対パスにスペースが入ってたりするとダメだとか…。

    キャンセル

  • 2017/06/03 23:39

    エラーの詳細をテキストファイルに貼り付けたものを追加しました。

    キャンセル

0

ある程度環境を作って検証しました。

情報: このコンテキストの再ロードが完了しました
entityManagerの設定
WARN : org.hibernate.ejb.HibernatePersistence - HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
WARN : org.hibernate.ejb.HibernatePersistence - HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
WARN : org.hibernate.ejb.HibernatePersistence - HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
WARN : org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000402: Using Hibernate built-in connection pool (not for production use!)
javax.persistence.PersistenceException: Unable to build entity manager factory
これからDAOクラスの検索メソッドを呼び出します
検索を始めます


スタックトレースを追うとDBに接続しに行っているのが確認できました。

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>


このページの回答に従ってproviderを上書きしただけです。

あと環境を作るにあたって気になった点ですが、
RegistrationControllerに@Controllerアノテーションと@RequestMappingが
なかった点でしょうか。
springMVCではないのでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/04 11:07

    コメントありがとうございます。質問についてですが、Hibernateは勉強中で、springMVCの使い方がよく分かっておりません。サイトに載っているソースコードや設定方法を元に学習目的でmavenプロジェクトを立ててアプリケーションを開発したため@Controllerアノテーション等は使っていません。
    またdwarfさんの回答を参考にpersistence.xmlを一旦、削除して再度作成してみたところ「No Persistence provider for EntityManager named restaurant」というエラーはなくなったのですが代わりに「SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".」というエラーが発生して「検索を始めます」がコンソールに出力されなくなりました。(デグった?)。解決方法は調査中です。

    キャンセル

  • 2017/06/04 11:12

    SLF4Jはログ出力系ですね。
    http://d.hatena.ne.jp/yehara/20090121/1232504942

    キャンセル

  • 2017/06/04 17:22 編集

    現状の問題としてはUnable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]というエラーが発生しています。pom.xmlのhibernate-coreのあたりのバージョンを少し触ったところ、DB接続すらできない状態となりました。
    解決方法は調査中です。

    キャンセル

0

ご自分で調査して試行していただくのはよいのですが、
何をどう変えたかがわからないとこちらとしても対処のしようがないです。

私は環境構築するのにここの連載を使っています。
デフォルトのpom.xmlにこの部分の依存性を追加するだけです。
Spring Frameworkを使ってみる ~データベースにアクセスする①~

一旦pom.xmlを切り戻してみるのがよいかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/07 23:10 編集

    コメントありがとうございます。一旦、pom.xmlの設定を見直すことにしました。共有していただいたページ(
    http://tech.pjin.jp/blog/2016/05/31/springframework7/)より
    pom.xmlに「<hibernate.version>4.3.10.Final</hibernate.version>」と
    以下の内容を追加しました。
    <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>${hibernate.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.2.5.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.8.1.RELEASE</version>
    </dependency>
    またMacのターミナルからMySQLを起動した状態で動かしたところ「現在のエラー状態」で出力されたようなエラーが表示されなくなりました。(EntityManagerの設定がうまくいったように見えます)
    「entityManagerの設定」以降のメッセージ(検索を始めます)と検索成功or検索失敗は出力されていないので今の問題としてはfindAllPreUserIdメソッドがうまく呼び出せていないところです。(そもそもの問題の原点に戻ったという感じです。)

    キャンセル

0

現在の私のソースを載せておきます。
コンパイルエラーが出ていたところは一時的にコメントアウトしています。
springMVCなので、RegistrationControllerのinvokeメソッドを
動かすためには
http://localhost:8080/registration/a
というアドレスにアクセスする必要があります。
今のところはfindAllPreUserIdメソッドまでは行きますが、
EntityManagerの中身がnullなのでヌルポインターで止まっているような感じです。

PreUserDAO.java

import java.io.Closeable;
import java.io.IOException;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import com.example.registration.entity.PreUserEntity;


/**
 * 仮ユーザーテーブルにアクセスする
 *
 * @author user
 *
 */
public class PreUserDAO implements Closeable {

    //final static String COMPLETED = "Comleted";

    //@Inject
    private EntityManager em;
    EntityTransaction et = null;

    public PreUserDAO() {
        System.out.println("entityManagerの設定");
        try{
            em = Persistence.createEntityManagerFactory("restaurant").createEntityManager();
        }catch(Exception e){
            System.out.println(e);
            //e.printStackTrace();
        }
    }

    /**
     * 仮ユーザーテーブルにレコードを挿入します
     *
     * @param preCostomerId
     */
//    @Override
//    public void insert(String preCostomerId, String processName) {
//        //TODO 未実装
//    }


    //仮ユーザIDを検索して取得します
    public void findAllPreUserId() {
        System.out.println("検索を始めます");
        List<PreUserEntity> entity = em.createQuery("select new registration.entity.PreUserEntity(p.preCustomerId) "
                + "from PreUserEntity p ", PreUserEntity.class).getResultList();

        if (entity.size() != 0) {
            System.out.println("検索成功");
        } else {
            System.out.println("検索失敗");
        }
        em.close();
    }

    @Override
    public void close() throws IOException {
        if (em != null) {
            em.close();
        }
    }
}

RegistrationBusinessLogic.java

import java.io.IOException;
import com.example.registration.dao.PreUserDAO;



public class RegistrationBusinessLogic {
    PreUserDAO dao = null;
    public void gettingPreUserIdFromDatabase() throws IOException {
        try {
            dao = new PreUserDAO();
            System.out.println("これからDAOクラスの検索メソッドを呼び出します");
            dao.findAllPreUserId();
        } finally {
            dao.close();
        }
    }
}

RegistrationController.java

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;



import com.example.registration.business_logic.RegistrationBusinessLogic;


@Controller
public class RegistrationController {
    //static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Logger.class.getName());
    private RegistrationBusinessLogic logic = null;

    public RegistrationController(){

    }
    @RequestMapping(value = "/a", method = RequestMethod.GET)
    public void invoke(String process_code){

        try {
            //DAOクラスを呼び出す
                //まずは仮会員IDを発番させる
                logic = new RegistrationBusinessLogic();
                logic.gettingPreUserIdFromDatabase();

        } catch (Exception e) {
            //TODO 未実装
        }
    }

}


EntityManagerにInjectするには@PersistenceContextアノテーションを使うのではないかと思っていますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/10 11:56 編集

    回答ありがとうございます。共有していただいたソースコードを参考に以下の手順を実施しました。
    ①pom.xmlに以下を追加する
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.8.RELEASE</version>
    </dependency>

    Spring MVCについては使い方を理解できていなくて愚問かもしれませんが
    @RequestMapping(value = "/a", method = RequestMethod.GET)の記述についてですがサーブレットが必要ないということでしょうか?一応サーブレットクラスも実装しており、調べてみたところSpring MVCでDBへの接続をするにはbean定義ファイルやSpringの設定ファイルが必要と記載があり大変そうなのですが、dwarfさんはSpringの設定ファイルやbean定義ファイルを作成しているのでしょうか?

    Spring設定参考サイト:(http://qiita.com/azun/items/5eff99fc1dcc6fdebc19)
    (http://qiita.com/siguremon/items/84c831391a6204079fd2)

    作成したサーブレット:
    package registration.servlet;

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import registration.controller.RegistrationController;
    import util.exception.UnexpectedProcessingException;
    import util.servlet.ServletResource;
    import util.util.OutputLogger;

    /**
    * サーブレットがコントローラーの役割を行うが ここでは受け渡しのみを実施する。 コントローラーの役割はビジネスロジックのクラスが担当する
    * サーブレットの役割と「モデル」と「ビュー」を制御つまり橋渡しの役
    */
    public class RegistrationServlet extends HttpServlet implements ServletResource{
    private static final long serialVersionUID = 1L;
    //static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Logger.class.getName());

    private final static String COMMON_URL = "CommonUrl";
    private final static String PROPERTY_FILE = "url.properties";
    private final static Properties prop = new Properties();
    private final static String API_NAME = "RegistrationServlet";

    // 初期化処理を行います
    public void init() throws ServletException{

    InputStream inStream = null;
    OutputLogger Logger = new OutputLogger();
    StackTraceElement throwableStackTraceElement = null;
    String outputInfoLogLine = null;
    try {
    throwableStackTraceElement = new Throwable().getStackTrace()[0];
    outputInfoLogLine = Logger.generateOutputInfoLogInfo(throwableStackTraceElement, 2);
    //logger.info("[プロパティファイル読込開始] ({})", outputInfoLogLine);
    throwableStackTraceElement = null;
    inStream = RegistrationServlet.class.getClassLoader().getResourceAsStream(PROPERTY_FILE);
    prop.load(inStream);
    } catch (IOException e) {
    Logger.generateOutputWarnLogInfo(API_NAME, e);
    gotoErrorPage("プロパティ読込エラー");
    } catch (NullPointerException e) {
    //TODO ログにipアドレスを出力するかどうか検討中
    Logger.generateOutputWarnLogInfo(API_NAME, e);
    gotoErrorPage("プロパティファイル未存在");
    } finally {
    try {
    if (inStream != null) {
    inStream.close();
    }
    throwableStackTraceElement = new Throwable().getStackTrace()[0];
    outputInfoLogLine = Logger.generateOutputInfoLogInfo(throwableStackTraceElement, 2);
    } catch (IOException e) {
    Logger.generateOutputWarnLogInfo(API_NAME, e);
    }
    }
    }

    /**
    * GETはボタンやリンクを押したように時に何も情報がないもののリクエスト POSTは入力フォームといったリクエストする情報が存在するもの
    * なのでボタンやリンクを押した場合はGETメソッドとなる(クエストリングのリクエストも含む)
    * 会員登録ボタンを押しただけGETで受け取り、以降の利用規約同意画面や会員情報入力はPOSTが担当する
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //初回の処理(会員登録ボタン〜利用規約同意画面は特にJSONデータは必要なし)

    // パラメータを取得する(DecidedResistration)
    String process_code = request.getParameter("process_name");

    // コントローラを呼び出す
    RegistrationController rc = new RegistrationController();
    rc.invoke(process_code);

    // 利用規約同意画面を表示する
    // String getRequestUrl = prop.getProperty(process_code);

    // 利用規約同意画面を表示する(JSON形式で必要なデータを送る)
    // sarver-restaurantに送りつける
    // buildUrl = REQUEST_URL + getRequestUrl;
    // response.sendRedirect(buildUrl);
    }

    /**
    * 基底クラス(ビジネスロジック例外)意外のシステムエラーをキャッチします。
    * DB接続失敗やユーザーの入力ミス等はビジネスロジック側で例外を処理します。 ログも基底クラスで出力するように設計すること
    * ここでチェックする例外はプロパティファイルの値取得失敗だけ 利用規約同意と会員入力フォームのリクエストを受け付ける
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //JSONを使ってリクエストのやりとりを行う
    }



    @Override
    public void gotoErrorPage(String errorMessage) {
    throw new UnexpectedProcessingException(errorMessage);
    }

    }

    キャンセル

  • 2017/06/11 21:09 編集

    すみません。私個人に質問されていたのに今気づきました。
    SpringMVCはSTSという開発プラグインがあるので
    ウィザードに従っていけばある程度作れます。
    bean定義ファイルはapplication-config.xmlやapplicationContext.xmlという名前で探せば出てきますが、DBへの接続設定(大まかにはpersistence.xmlと同じ内容)です。
    MVCフレームワークはservletを意識せずに作れるように設計されているので、サーブレット云々は一旦横に置かれた方がよいかと思います。
    (RegistrationControllerをどう発火させてるのか疑問でしたがようやくわかりました)

    キャンセル

  • 2017/06/11 23:15 編集

    ご回答ありがとうございます。ぜひ参考にしたいと思っておりますが、一旦は現状の状態(Spring MVCを使わず)で検索処理を完成させようと思っています。とあるサイトでEntityManagerの設定についての参考になるソースコードがあったので設定してみたところEntityManagerで止まらずにエラーログを出したままロジッククラスまで戻ることができました。(close処理にてNullPointerExceptionが発生)検索処理が一通り完成したら別途mavenプロジェクトを作成してそちらで同じ内容のSpring MVC使用バージョンとしてDB接続と検索ができるプログラムを作成しようと考えています。

    キャンセル

0

昔に少し勉強がてらSpringMVC+Maven+Hibernateでほぼ空の簡単なプロジェクト作成したことありますが
ソースを見て気になったのは、DIしてるクラス変数を持つPreUserDAOをRegistrationBusinessLogicでnewしてるとこですかねぇ。DIってコンテナ起動時に行われてるような説明をどこかで見た気がしたのでnewしたインスタンスではDIの意味がないというかできないように思えるんですが間違ってたらすいません。

自分の場合は、DBに問い合わせる処理を書いたクラスをコントローラークラスでDIして使ってます。
スキャン対象のパッケージを記載した設定ファイルとそこら辺を見直してはどうでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/10 18:05

    そうなんですね。SpringMVCの使い方がよくわからない状態でJPAとHibernateを使ってWebアプリケーションを開発しています。新たにxmlファイルを作って読み込ませてみたら問題なくDB接続と検索結果取得までできるかもしれないですね。

    キャンセル

check解決した方法

-1

解決していませんが、質問ページが見づらくなってしまったため、一度新しく質問スレッドを作り直します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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