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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

10618閲覧

Dtoに値を設定しようとしてNullPointerエラー

chaso

総合スコア8

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2018/05/14 06:24

編集2018/05/14 06:25

前提・実現したいこと

ある処理を実行した後に、他処理、画面に対象となるデータを受け渡したいためDtoに値を設定したい。

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

NullPointerExceptionが発生してしまっている。

該当のソースコード

TesttDto.java

Java

1package test.model.dto; 2import java.util.List; 3import test.entities.Test; 4 5public class TesttDto { 6 7 private List<String> aList; 8 9 private int aLogic; 10 11 public List<String> getAList() { 12 return aList; 13 } 14 15 public void setAList(List<String> aList) { 16 this.aList = aList; 17 } 18 19 public int getALogic() { 20 return aLogic ; 21 } 22 23 public void setALogic(int aLogic) { 24 this.aLogic = aLogic; 25 }

TestInterceptor.java

Java

1package test.interceptor; 2import javax.servlet.http.HttpServletRequest; 3import javax.servlet.http.HttpServletResponse; 4import org.springframework.beans.factory.annotation.Autowired; 5import org.springframework.context.annotation.Scope; 6import org.springframework.stereotype.Component; 7import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 8import test.model.dto.TestDto; 9@Component 10@Scope("request") 11public class TestInterceptor extends HandlerInterceptorAdapter{ 12 @Autowired 13 TestDto testDto; 14 /** 15 * URL分解処理 16 */ 17 @Override 18 public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){ 19 String uri = request.getRequestURI(); //URIを取得。 20 String[] uriAry = uri.split("/"); //URIを「/」で分割。 21 22 List<String> aList = new List<String>(); 23 String aCode = ""; 24 int aLogic = 0; 25 String[] aCodeAry = {}; 26 for (int i = 1; i < uriAry.length; i++) { 27 if (urlAry[i].startsWith("a")) { 28 aCode = uriAry[i].indexOf("+"); //URLのパラメータに「+」が含まれているか確認する変数。(パラメータの繋ぎ(接続詞)は「+」か「-」のどちらかしか入らない。) 29 if (resultLogicCd != -1) { 30 aLogic = 1; //「+」が含まれる場合、1をセット。 31 aCodeAry = uriAry [i].split("+"); 32 } else { 33 aLogic = 0; //「+」が含まれない場合、0をセット。 34 aCodeAry = uriAry [i].split("-"); 35 } 36 for (int j = 0; j < aCodeAry.length; j++) { 37 aList.add(aCodeAry[j].substring(aCodeAry[j].indexOf("a") + 1)); 38 } 39 testDto.setACode(aList); //ここでNullPointerException発生 40 testDto.setALogic(aLogic); //1行上をコメントアウトし、こちらを実行してもNullPointerException発生。 41 } 42 } 43 return true; 44}

補足情報(FW/ツールのバージョンなど)

Java8、Spring

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決済みのようですが、見たところ一応TestDtoは@Autowiredでインジェクションする実装になっているので、
ここでnewしてしまうとSpringのDIコンテナ上で管理されているオブジェクトではないオブジェクトを新たに作ってしまうことになります。
(それでいいのであれば、そもそも@Autowiredでインジェクションする必要が無い)

実現したいことに、

ある処理を実行した後に、他処理、画面に対象となるデータを受け渡したいためDtoに値を設定したい

とあるので、おそらく質問の都合上、便宜的にTestDtoと記載しているクラスのオブジェクトを他のクラスでもインジェクションして利用したいのではないでしょうか?
そうだとしたら、記載いただいている実装で自前でnewしてしまうとTestDtoオブジェクトはpreHandleメソッド内のスコープでしか存在しないこととなってしまい、

testDto.setACode(aList); //ここでNullPointerException発生 testDto.setALogic(aLogic); //1行上をコメントアウトし、こちらを実行してもNullPointerException発生。

の部分でtestDtoオブジェクトに設定した内容は、他では利用できなくなってしまいます。

それで、NullPointerExceptionが発生してしまう原因についてですが、
そもそもTestDtoがDIコンテナに登録されていないとかはないでしょうか?

(的外れだったらスルーしてください)

投稿2018/05/14 07:54

kochoru

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

testDto.setACode(aList); //ここでNullPointerException発生

とりあえず、testDto が null なのだと思いますが。

TestInterceptor の最初で

TestDto testDto;

を定義はしているようですが、new してないからではないでしょうか?

投稿2018/05/14 06:31

sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chaso

2018/05/14 06:35

あ、そうですね… 本当に初歩のところ見落としていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問