[Java Spring MVC]開発確認用コントローラー

## PHPに慣れているとJavaでのWebアプリ開発はやりにくい
* Java Spring MVC でのWebシステム開発の案件にアサインされた。
* 他社が過去に作ったシステムを引き継ぎ、改善や修正をしなくてはならない。
* Spring Boot という仕組みには乗っかっていない。
* PHPなら`var_dump();`や、各フレームワークの提供しているデバッグ用の関数を使って変数の中身なんかを簡単に確認できるが、Javaではそれがやりにくい。
* 統合開発環境のソフトウェア（Eclipseなど）経由でアプリケーションを起動できればそのコンソールに`System.out.println("");`で文字列を出力できるが、既存のシステムの設定が悪いのかなんなのか、数時間取り組んでも統合開発環境からのアプリ実行ができなかった。
* コードが例外で終了した際、既に作られたエラーページが表示されてしまい、このページにはスタックトレースなどのデバッグ情報が一切ないのでどういうエラーなのかがわからない。ログファイルを見てもエラーが書き込まれる場合とそうでない場合がある。できればエラーが起きたら画面に情報を表示してほしい。

## ダミーのコントローラーを作って開発の助けにする
* そこで、試したいコードを書いて動作や変数を確認するための場となるダミーコントローラーを作った。
* `var_dump();` のようにオブジェクトを雑に渡してその中身を全部表示してくれるという仕組みまでは対応していない。文字列だけは出力できるので確認出力には工夫が必要。
* 例外で終了すればスタックトレースを画面に表示する。

## ダミーコントローラー

```
package パッケージ名;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


// @RestController を指定することでViewファイルを使わずにこのコントローラーのみで出力を制御できる
@RestController
public class DummyController {

    private static final Logger logger = LoggerFactory.getLogger(DummyController.class);

    /**
     * 確認したい内容をテストコードに書いて出力を文字列のリストに追加、それらを画面に表示する。
     * URL : サイトのドメイン/dummy
     * produces = "text/plain;charset=UTF-8" を指定することで出力がHTMLではなくテキスト扱いになり、日本語文字列も使える。
     */
    @RequestMapping(value = {"/dummy"}, produces = "text/plain;charset=UTF-8")
    public String dummy() {
      return this.printToScreen(this.buildListToConfirm());
    }


    /**
     * 出力確認したいテストコード
     */
    private List<String> codeTrial(List<String> list) {
      /*-----------------------------------*/
      // テストコードここから
      /*-----------------------------------*/

      //ここに確認したいコードを書く
      //画面に出力したい文字列は list に追加していく
      list.add("hoge");

      /*-----------------------------------*/
      // テストコードここまで
      /*-----------------------------------*/
      return list;
    }

    private List<String> buildListToConfirm(){
      List<String> list = new ArrayList<String>();
      try {
        list.add("---------- 開始 ----------");
        list = this.codeTrial(list);
        list.add("---------- 終了 ----------");
      } catch (Exception e) {
        list.add(this.getStackTraceStr(e));
      }
      return list;
    }

    /**
     * エラーのスタックトレースを表示
     */
    private String getStackTraceStr(Exception e) {
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
      e.printStackTrace(pw);
      pw.flush();
      String stackTraceStr = sw.toString();
      return stackTraceStr;
    }

    /**
     * 画面に表示して確認
     */
    private String printToScreen(List<String> list){
      String output = "";
      for(String s : list){
          output = output + s + "\n";
      }

      return output;
    }
}
```

コードを書いたらビルドして、「/dummy」のURLにアクセスする。URLは変更可能。

## 画面出力サンプル
![スクリーンショット 2018-10-05 9.23.04.png](https://qiita-image-store.s3.amazonaws.com/0/159641/c513ebb9-5724-8899-922d-4e924cb58390.png)


エラーで終了時はスタックトレースが出力される
![スクリーンショット 2018-10-05 9.35.54.png](https://qiita-image-store.s3.amazonaws.com/0/159641/d43751c2-9d66-b987-4d8f-98bb0d976c03.png)