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

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

ただいまの
回答率

90.34%

  • Java

    14409questions

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

  • Spring Boot

    573questions

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

  • JDBC

    94questions

    JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

springでjdbcTemplateを@Controller以外のクラスで使用するとエラーになる

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,587

simishu

score 2

アノテーションを充分に理解していないから、だと思いますが、
@Controller以外のクラスでjdbcTemplateを利用するとNullpointerExceptionが発生します。

【上手く行くソース:2クラスで実施】

@Controller
SystemManageController.java
public class SystemManageController {

@Autowired
private JdbcTemplate jdbcTemplate;

@RequestMapping("/systemManage/logSearch")
public String logsearch() {
List<Map<String, Object>>  list = jdbcTemplate.queryForList("select operationTime from SYS_OPERATION_LOG");
for (int i = 0;i < list.size();i++) {
System.out.println("DB DEBUG:" + list.get(i).get("operationTime"));
return "html/logSearch";
}

}

DataSourceConfiguration .java
package jp.co.XXXX.service.operationService;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {

@Bean
public DriverManagerDataSource dataSource() {
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(com.mysql.jdbc.Driver.class.getName());
driverManagerDataSource.setUrl("jdbc:mysql://XXX.XXX.XXX.XXX:3306/DB名");
driverManagerDataSource.setUsername("ユーザ");
driverManagerDataSource.setPassword("パスワード");
return driverManagerDataSource;
}

@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}

@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
}

【上手く行かないソース:3クラスで実施】
※DataSourceConfiguration .javaは同じ

SystemManageController.java
public class SystemManageController {

@Autowired
private JdbcTemplate jdbcTemplate;

@RequestMapping("/systemManage/logSearch")
public String logsearch() {
OperationServiceDBControl facade = new OperationServiceDBControl();
facade.logInsert();

return "html/logSearch";
}
OperationServiceDBControl 
package jp.co.XXXX.service.operationService;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class OperationServiceDBControl {

@Autowired
private JdbcTemplate jdbcTemplate;

public void logInsert() {
List<Map<String, Object>>  list = jdbcTemplate.queryForList("select operationTime from SYS_OPERATION_LOG");
for (int i = 0;i < list.size();i++) {
System.out.println("DB DEBUG:" + list.get(i).get("operationTime"));
}
}
}

上手く行かないソースの構造(DBの処理をさせるのはControllとは別のクラス)で、行いたいのですが、できますでしょうか?
出来る場合にはどうすればよいのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+3

できます。

拝見したところ、JdbcTemplateのBean設定には全く問題ありませんでした。それ以外のクラスたちの設定とSpring管理下のクラスに置くところに設定抜けがあるようですね。

例えばですが、データベースにアクセスするクラスである SampleServiceクラスとすると、

@Service
public class SampleService {
    @Autowired
    protected JdbcTemplate jdbcTemplate;

    public List<Map<String, Object>> selectAddresses() {
        return jdbcTemplate.queryForList("SELECT * FROM address ORDER BY id");
    }
}

このようになります。このServiceクラスはSpringBootをお使いでしたら、Applicationクラスを作成したパッケージの下に service パッケージを作成してその中に置き、@Serviceアノテーションを付けましょう。

このServiceクラスを呼び出すControllerからは、この@ServiceクラスをSpringから呼び出すようにします。つまりSpring管理下でBeanを呼び出します。

@RestController
public class SystemManageController {
    @RequestMapping("/search")
    public List<Map<String, Object>> index() {

        List<Map<String, Object>> result = service.selectAddresses();

        return result;
    }

    @Autowired
    SampleService service;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/06 16:28

    確認しました。行いたいことが出来ました、ありがとうございます。

    キャンセル

  • 2017/03/07 17:13

    d(・ω・

    キャンセル

0

OperationServiceDBControl facade = new OperationServiceDBControl(); 

Springの依存性注入宣言をしても、自身でnewしているから、
このオブジェクトにモノがないのではないかと。

書きっぷりに自信はあまりありませんが、DriverManagerDataSource の元ソースのように、
「@Bean」アノテーションでOperationServiceDBControl を返すメソッドを書いておき、

@Autowired
OperationServiceDBControl facade;

と書けばSpringが@Beanを見て@Autowiredしてくれるかと。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/06 15:42

    回答ありがとうございます。ですが、@Beanは起動時に読込まれる認識です。
    上記対応で確かにDBアクセスは起動時に行われますが、期待値としてはSystemManageControllerの
    "/systemManage/logSearch"を実行されるたびに、呼ばれたいです。
    出来ますでしょうか?

    キャンセル

  • 2017/03/06 15:48 編集

    A-pZさんの回答を見て、私がイマイチ理解してない回答だったのに気付きました。
    大変失礼しました・・・。

    Springに依存性注入させる場合、注入して欲しいクラスに
    「@Service」アノテーションを付与することで対象になります。

    キャンセル

  • 2017/03/06 16:27

    akio221さん
    こちらの質問が下手で申し訳ありません。ありがとうございました。

    キャンセル

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

  • Java

    14409questions

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

  • Spring Boot

    573questions

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

  • JDBC

    94questions

    JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。