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

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

ただいまの
回答率

90.23%

@Resourceアノテーションの使い方について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,384

estark

score 11

当方java勉強中の身です。

表題の件について、自分で調べてもわからなかったので、質問させて頂きます。

「webのフォームから入力されたキーワードをテーブルへインサートする」というプログラムを作成しようとしております。その際にDB接続の部分を@Resourceアノテーションを使用して製造したいと思っております。

事象としては、Sample2.javaのみを呼び出す場合は、成功するのですが、テーブルインサート部分を別クラス「DataAccess2.java」を呼び出してで実施しようとすると、「DataAccess2.java」の9行目のgetConnection()の箇所でNullPointerExceptionが発生します。おそらく、「DataAccess2.java」で指定している@Resouceが悪いのだと思うのですが、理由がわかりません。初歩的な事で大変恐縮ではございますが、教えて頂けると幸いです。

発生している問題・エラーメッセージ

java.lang.NullPointerException
    at rogres.DataAccess2.insertPostgre(DataAccess2.java:17)
    at rogres.Sample2.doGet(Sample2.java:30)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

該当のソースコード

★うまくいく場合
Sample2.java

public class Sample2 extends HttpServlet {
    @Resource(name="mydb")
    private DataSource datasource;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

        String vals[] = request.getParameterValues("name");

        try {

        Connection con = this.datasource.getConnection();
        Statement stat = con.createStatement();
        String sql = "insert into test2 (name) values('" + vals[0] + "') ";
        stat.executeUpdate(sql);

        response.setContentType("text/html; charset=Shift_JIS");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>サンプルHTML</title>");
        out.println("</head>");
        out.println("<body>");
            out.println("<p>");
            out.println("更新が完了しました");
            out.println("</p>");
            out.println("</body>");
        out.println("</html>");

        } catch (Exception e) {
         ・・以下略

★事象が発生する場合のコード
Sample2.java

public class Sample2 extends HttpServlet {
    @Resource(name="mydb")
    private DataSource datasource;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

        String vals[] = request.getParameterValues("name");

        try {

        DataAccess2 da2 = new DataAccess2();
        da2.insertPostgre(vals);

        response.setContentType("text/html; charset=Shift_JIS");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>サンプルHTML</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>");
        out.println("更新が完了しました");
        out.println("</p>");
        out.println("</body>");
        out.println("</html>");

        } catch (Exception e) {
         ・・以下略


DataAccess2.java

public class DataAccess2 {

@Resource(name="mydb")
private DataSource datasource;

public void insertPostgre(String param[]) throws Exception{

    try {
        Connection con = this.datasource.getConnection();
        Statement stat = con.createStatement();
        String sql = "insert into test2 (name) values('" + param[0] + "') ";
        stat.executeUpdate(sql);
    } catch (Exception e) {
        throw e;
    }
}
}

情報提示の過不足等あればご指摘頂ければと思います。
以上、よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • narita_takashi

    2016/12/08 15:55

    @resourceの使い方を見る限りご利用されているフレームワークはSeasarでしょうか?、またNullPointerException発生時のスタックトレースを拝見させて頂けると有難いです

    キャンセル

  • estark

    2016/12/08 16:04

    コメントありがとうございます。フレームワークは特に使用しておりません。またログを追加させて頂きました。何卒よろしくお願いいたします。

    キャンセル

  • narita_takashi

    2016/12/08 16:19

    「String vals[] = request.getParameterValues("name");」、なので恐らく(サーブレットの呼び出し元)からの値が上手く取得できてないようなのですが、このサーブレットの呼び出し元(画面?)からは問題なく値とれてますか?

    キャンセル

  • estark

    2016/12/08 16:27

    コメントありがとうございます。うまくいく場合の「Sample2.java」でも同様の処理を実施しており、その場合はエラーも発生せず、テーブルへインサートできている事を確認しておりますので、画面からの値は問題ないのではないかと考えております。よろしくお願いします。

    キャンセル

回答 1

checkベストアンサー

0

14. Servlet2.5 アノテーション | TECHSCORE(テックスコア)
に記載の通り、この機能ってサーブレットの機能なので

DataAccess2 da2 = new DataAccess2();
da2.insertPostgre(vals);


この部分を

datasource.insertPostgre(vals);

こんな感じに修正頂ければと。
サーブレットで生成したdatasourceインスタンスを使う形ですね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/08 16:41

    回答ありがとうございます。
    insertPostgreはDataAccess2クラスで定義しているメソッドなので、datasourceからは呼び出せませんでした。

    >に記載の通り、この機能ってサーブレットの機能なので
    そうだったんですね。ということは、呼び出し先のDataAccessクラスでは使えないという事ですかね。

    キャンセル

  • 2016/12/08 16:49

    あら、、、失礼しました。
    呼び出し先のDataAccessクラスのコンストラクタで渡してあげればよいかと
    例)
    public DataAccess2(DataSource datasource) {
    this.datasource = datasource;
    }

    として、Sample2.java側では
    DataAccess2 da2 = new DataAccess2(datasource);
    da2.insertPostgre(vals);

    こうする感じですね。

    キャンセル

  • 2016/12/08 17:05

    サンプルまでご用意頂きありがとうございます。無事に動かす事が出来ました。
    張って頂いたリンクについて、読み込んで勉強したいと思います。
    本当にありがとうございました。

    キャンセル

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

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