- 投稿日:2021-01-18T21:15:40+09:00
Lombokの@Accessorsについて
@Accessors:getter/setterをカスタマイズするためのアノテーション
@Getter/@Setterなどと一緒に使う
オプションは "chain" "fluent" "prefix" の3種類環境
Java : 1.8
Lombok : 1.18.16
(SpringBoot : 2.3.7)setterのメソッドチェーン化
@Accessors(chain = true)
でsetterをメソッドチェーン化する
↓user.setName("Tom").setAge(24);のように連続して記述できる
<実際に生成されるコード>
public User setName(final String name) { this.name = name; return this; }<ポイント>
つけるのはクラスでもフィールドでも可、ただしどちらに付けてもクラス内に一つでも存在すると全フィールドに適用されるgetter/setterをフィールド名で使用
@Accessors(fluent = true)
でgetter/setter名をフィールド名で使用できるようにする
↓String name = user.name(); // getter user.name("Tom"); // setterのようにフィールド名でgetter/setterを記述できる
<実際に生成されるコード>
public String name() { return this.name; } public void name(final String name) { this.name = name; return this; }<ポイント>
つけるのはクラスでもフィールドでも可、chainと違い、フィールドに付けた場合はそのフィールドのみに適用されるprefix部分を除いた名称を用いてgetter/setterを定義
@Accessors(prefix = "f") private String fName;でprefix部分を除いた名称を用いてgetter/setterを定義する
↓String name = user.getName(); // getter user.setName("Tom"); // setterのようにprefix部分を除いた名称でgetter/setterを記述できる。
<実際に生成されるコード>
public String getName() { return this.fName; } public void setName(final String fName) { this.fName = fName; }<ポイント>
つけるのはクラスでもフィールドでも可
→クラスに付与した場合:全フィールドに適用、prefixを満たさないフィールドはgetter/setterが生成されない
フィールドに付与した場合:そのフィールドのみに適用<具体例>
@Getter @Setter @Accessors(prefix = {"f", "t"}) public class User { private Integer id; private String fName; private Integer tAge; }↓
○実際に生成されるコードpublic String getName() { return this.fName; } public void setName(final String fName) { this.fName = fName; } public Integer getAge() { return this.tAge; } public void setAge(final String tAge) { this.tAge = tAge; }
private Integer id;
はprefixとして記述した”f”も”t”もついていないのでコードが生成されない。
- 投稿日:2021-01-18T20:36:00+09:00
InputStreamをStringに変換したい
必要になるたびにぐぐるのに疲れたので自分用のメモとしておいておきますね(´・ω・`)
InputStream
をすべて読み込んでString
に変換したい場合、おおよそ以下のように書いておけば大丈夫です。public static String readAll(InputStream in) throws IOException { byte[] b = new byte[1024]; ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; while ((len = in.read(b)) != -1) { out.write(b, 0, len); } return out.toString(); }また
String
に変換したいInputStream
の文字コードがUTF-8ではない場合、ByteArrayOutputStream.toString(Charset charset)
を利用すればよいです。たとえばInputStream
がWindows-31Jの場合は以下のように書きます。public static String readAll(InputStream in) throws IOException { byte[] b = new byte[1024]; ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; while ((len = in.read(b)) != -1) { out.write(b, 0, len); } return out.toString(Charset.forName("Windows-31J")); }なお車輪の再発明を避ける意味でも、Apache CommonsのIOUtilsなど、OSSのライブラリが使える場合はそちらを使いましょう(´・ω・`)
環境情報:
C:\>javac -version javac 11.0.3 C:\>java -version openjdk version "11.0.3" 2019-04-16 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)
- 投稿日:2021-01-18T18:39:10+09:00
初心者が1から始めるJava開発-Vol.1- eclipseセットアップ編
今回はJava開発を1から始める初心者向けの投稿をしたいと思います。
Javaの記事はいつか書きます(自学のために)。
Javaの初心者向けおすすめ本
総合開発環境(IDE)の用意
今回はeclipseを使っていきます。
使用PC:Windows10
インストール
※2021年1月18日時点の情報です。
ダウンロード
以下のページから最新版をダウンロードしてください。
https://www.eclipse.org/downloads/
インストーラー起動
ダウンロードが終了したら、インストーラーを起動します。
ダウンロードしたexeファイルをダブルクリックして起動します。
Eclipse IDE for Enterprise Java Developers を選択します。
そのままINSTALLを押してください。
Agreementの画面が出てきますが、AcceptNowでOKです。
しばらくすると「Unsigned Content」というダイアログが出るので「Accept」をおします。
完了したらLaunchボタンを押下しましょう。eclipseが起動します。
起動
workspaceディレクトリを指定する画面が出ますが、そのままLaunchします。
Welcomeの画面が出ますがタブの✖を押して閉じちゃいましょう。
これでひとまず準備は完了です。
次回以降、Javaで開発を進めていきます。
- 投稿日:2021-01-18T12:05:01+09:00
Spring Bootで、テスト実行時にFlywayを走らせない方法
はじめに
現在のプロジェクトで、
SpringBoot
とFlyway
を使用していますが、
テスト実行時(当プロジェクトではGradle
を使用しているため、./gradlew test
)に、
Flyway
のMigrate
が走ってしまう現象がありました。
その時の解決方法の一つになります。どのような解決をしたのか
ご存知の方からしたら当たり前のことかもしれませんが、
SpringBoot
はテスト実行時に、設定ファイルの優先順位が変わります。
具体的には、下記のような構成だとして、/project ├── build.gradle ├── gradlew └── src ├── main │ ├── com │ │ └── ... │ └── resources │ └── application.yml └── test ├── com │ └── ... └── resources └── application.yml
jarファイルなどで実行した場合は
src/main/resources/application.yml
を読み込みますが、
テスト実行時はsrc/test/resources/application.yml
を読み込んでくれます。この辺りは下記記事がより詳細に説明してくださってるので、そちらを参照ください。
Spring Boot - テスト時に読み込むDBを変更する上記の特性を利用し、
src/test/resources/application.yml
側の設定ファイル(テスト時の設定ファイル)に、
Flywayを無効化する下記記述を追加しました。spring: flyway: enabled: false最後に
知っている方からしたらなんてことないことですが、知らない方からしたら若干のハマりポイントではないでしょうか。
そのため、覚書としても記事を記述させていただきました。短いですが以上です。ありがとうございました。
- 投稿日:2021-01-18T12:05:01+09:00
Spring Bootで、単体テスト実行時にFlywayを起動しない方法
はじめに
現在のプロジェクトで、
SpringBoot
とFlyway
を使用していますが、
テスト実行時(当プロジェクトではGradle
を使用しているため、./gradlew test
)に、
Flyway
のMigrate
が走ってしまう現象がありました。
その時の解決方法の一つになります。どのような解決をしたのか
ご存知の方からしたら当たり前のことかもしれませんが、
SpringBoot
はテスト実行時に、設定ファイルの優先順位が変わります。
具体的には、下記のような構成だとして、/project ├── build.gradle ├── gradlew └── src ├── main │ ├── com │ │ └── ... │ └── resources │ └── application.yml └── test ├── com │ └── ... └── resources └── application.yml
jarファイルなどで実行した場合は
src/main/resources/application.yml
を読み込みますが、
テスト実行時はsrc/test/resources/application.yml
を読み込んでくれます。この辺りは下記記事がより詳細に説明してくださってるので、そちらを参照ください。
Spring Boot - テスト時に読み込むDBを変更する上記の特性を利用し、
src/test/resources/application.yml
側の設定ファイル(テスト時の設定ファイル)に、
Flywayを無効化する下記記述を追加しました。spring: flyway: enabled: false最後に
知っている方からしたらなんてことないことですが、知らない方からしたら若干のハマりポイントではないでしょうか。
そのため、覚書としても記事を記述させていただきました。短いですが以上です。ありがとうございました。
- 投稿日:2021-01-18T10:28:10+09:00
Bean scopeとBean Life Cycle
Bean scope
Bean scope
Springで別途の設定をしない場合、default bean scopeはsingletonで構成されます。singleton : spring default bean scope
prototype:アプリケーションリクエスト時に(getBean()メソッドが呼び出されるたびに)スプリングが新しいインスタンスを生成します。
request:HTTP リクエストごとにインスタンス化され、リクエストが終わると消滅します。
session:HTTP セッションごとにインスタンス化され、セッションが終了すると消滅します。
global session:ポートレート基盤のウェブアプリケーション用途で、全域セッションスコープが空のようなスプリングMVCを使用したポータルアプリケーション内のすべてのポートレートの間で共有できます。
thread:新しいスレッドから要請すると、新しいbeanインスタンスを作成します。 同じスレッドの要請には常に同じインスタンスが返されます。
custom : org.pringframework.beans.factory.config.Scopeを実装し、そしてカスタムスコープをスプリングの設定に登録することによって使用します。※ request、session、global sessionのスコープは、一般のspringアプリケーションではなく、Spring MVC Applicationでのみ使用される用途です。
空きスコープを指定する方法は、XMLを利用した方法と、アノテーションを利用した方法があります。
XML
<bean id="memberBean" class="com.java.Member" scope="singleton"/>Annotation
package com.java.pojo; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @Service("memberBean") @Scope("singletone") public class Member { }Bean Life Cycle
Bean Life Cycle
空きライフサイクルは基本的に生成、依存設定、初期化、消滅の段階を経ます。 でも、どんなコンテナを使うかによって違います。Bean Factoryは、基本的な依存性注入をサポートする最も簡単な形態のコンテナで、getBean()メソッドが呼び出されるまで空の生成を先送りします。 Application Contextは、BeanFactoryを継承した形態でBeanFactoryのすべての機能を持ち、追加的な機能を持つコンテナです。 Application contextはcontextが始まる前にすべての空きを作成してロードして、好きな時期にいつでもコピーして使えます。
Initialize & Destory メソッド
Bean Initializeメソッドは、Bean Objectが作成されてDIを終えた後に実行されるメソッドです。 一般的にObjectの初期化作業が必要な場合は生成者に処理しますが、DIによってBeanが注入された後に初期化後に初期化作業がある場合は、初期化メソッドを利用して初期化を進めます。@Slf4j @Component public class SimpleBean { @PostConstruct public void postConstruct() { log.info("postConstruct"); } }@Slf4j @Component public class SimpleBean { @PreDestroy public void preDestroy() { log.info("preDestroy"); } }
- 投稿日:2021-01-18T08:51:06+09:00
【Java】DateクラスのcompareToメソッドの使い方
compareToメソッドとは?
Dateクラスの日にちを比較するメソッドで、メソッドの呼び出し元の日付と引数の日付を比較します。
以下のように、引数と呼び出し元を比較し、値を返します
メソッドの呼び出し元の値が、引数と等しい場合は0
メソッドの呼び出し元の値が、引数より前の場合は-1
メソッドの呼び出し元の値が、引数より後の場合は1使い方
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Date date1,date2; date1 = sdf.parse("20210117"); date2 = sdf.parse("20210118"); System.out.println(date1.compareTo(date2)); // -1 ->date1はdate2より前である System.out.println(date2.compareTo(date1)); // 1 ->date2はdate1より後である参照