2017年2月8日水曜日

Spring Boot / Form周り

Spring BootのForm周りでつまずいたところのメモ
時々intelliJショートカットやGradleのメモ


メモ

Gradle / 拡張プロパティ
ext {
  springBootVersion = '4.0.0.BUILD-SNAPSHOT'
}

Gradle / buildscript
拡張プロパティやレポジトリ、ビルドツールの依存を記述
ライブラリの依存は別の場所
buildscript { 
 ext { // extended property
  springBootVersion = '2.0.0.BUILD-SNAPSHOT'
 }
 repositories {
  mavenCentral()
  maven { url "https://repo.spring.io/snapshot" }
  maven { url "https://repo.spring.io/milestone" }
 }
 dependencies {
  classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
 }
}

Gradle / タスク名は前方一致で特定できれば省略できる
公式参照

Gradle / -x
依存しているタスクを省略
$ gradle --daemon jar 
:compileJava
:processResources
:classes
:jar

BUILD SUCCESSFUL

Total time: 2.217 secs
--
$ gradle --daemon jar -x compileJava
:processResources UP-TO-DATE
:classes
:jar UP-TO-DATE

BUILD SUCCESSFUL

Total time: 0.844 secs


Spring / URLをパラメータとして受け取る
@RequestMapping("/{param}")
public String calc(@PathVariable int param) {

ちなみに、型が違うと下記のように怒られます
Tue Feb 07 22:24:50 JST 2017
There was an unexpected error (type=Bad Request, status=400).
Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "hoge"

少数は問題なかったです。

intelliJ + lombok
Qiita IntelliJ IDEA+GradleでLombokを使う
Enable annotation processing にチェックが覚えられない
Welcome画面で設定すればデフォルト設定できます。
現在Gradleの設定は、 compileOnly "org.projectlombok:lombok:1.16.12" でした

また、ディレクトリのインポート時にbuild.gradleにlombokをdependenciesに記載していなかった場合、
build.gradleに追記後、それをsynchronizedする必要があるみたいでした。
少なくても自分の環境では、synchronizedしないとimport lombok.*;は認識しませんでした。
  • @Data:getter/setter/toString/equals/hashCode
  • @AllArgsConstructor
  • @NoArgsConstructor
うむ、楽だ。

Spring / org.springframework:springloaded
htmlファイルの更新時に、再読み込みをするライブラリ
参照: Qiita Spring Boot + Thymeleaf + Tomcat + Gradleで業務系アプリ 躓いた所6点
buildscript {
 ext {
  springBootVersion = '1.5.1.RELEASE'
 }
 repositories {
  mavenCentral()
 }
 dependencies {
  classpath
                  ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  classpath "org.springframework:springloaded"
 }
}
開発効率上げるために入れたほうがいい。

Thymeleaf自体はgradleで
compile "org.springframework.boot:spring-boot-starter-thymeleaf"

またまた、thymeleafのキャッシュは開発時には切っておきます。
[application.properties]
spring.thymeleaf.cache=false

Spring / @Controllerと@RestController
かなり恥ずかしい話ですが、違いがよくわかっていなかった。
@Controllerが付いているクラスのメソッドの戻り値は、HTMLテンプレートのファイル名
@RestControllerがついているクラスのメソッドの戻り値はHTTPレスポンスボディ

参考:Qiita Spring MVCのコントローラでの戻り値いろいろ

Git / **/で再帰的にignore
参考:MindTo01s git-ignoreの設定

Spring / 2.0.0-SNAPSHOTで超絶シンプル@Controllerサンプルを試してみるも。。。
ルーティング(@RequestMapping)がうまくいかず、ファイルがあるのに404が出た
hotload=ONやhtmlcache=OFFの設定があったので、とりあえずミートしてみましたが、変わらず。
1.5.1.RELEASEで同じコードを試したら、問題なくルーティングできた。
無駄に時間食ったわ。。。

Spring / ModelとModelAndView
Modelはセッションの属性値を持つだけ。
ビューのファイル名は別途メッソドの文字列返り値として渡す。

一方、ModelAndViewはセッションの属性値に加え、viewNameとしてビューのファイル名をもつ。
// Model
@RequestMapping("/{num}")
public String index(@PathVariable int num, Model model) {
  model.addAttribute("msg", "arg: " +num);
return "index"; // index.htmlを開く

// ModelAndView
public ModelAndView index(@PathVariable int num, ModelAndView modelAndView) {
  modelAndView.addObject("msg", "total: " + res);
  modelAndView.setViewName("index");
return modelAndView; // index.htmlを開く

IntelliJ w/Mac 1行消す
Command + delete
Qiita 忙しい人のためのIntelliJ IDEAショートカット集(´-`)

Command + dかと思ったんですが、逆に1行増えました。。。。Duplicateっすね。

Spring / フォームの値受け取り
@RequestParam("form_name") Type var_name
public ModelAndView submit(@RequestParam("name") String name , ModelAndView modelAndView) {

forwardとredirect
forwardはURLは元のまま、
redirectはURLも遷移後のものとなります。
Modelの場合
return "forward:/";

ModelAndViewの場合
return modelAndView;

0 件のコメント:

コメントを投稿