20210118のJavaに関する記事は7件です。

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”もついていないのでコードが生成されない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者が1から始めるJava開発-Vol.1- eclipseセットアップ編

今回はJava開発を1から始める初心者向けの投稿をしたいと思います。

Javaの記事はいつか書きます(自学のために)。


Javaの初心者向けおすすめ本


スッキリわかるJava入門 第3版 (スッキリシリーズ)


総合開発環境(IDE)の用意

今回はeclipseを使っていきます。

使用PC:Windows10

インストール

※2021年1月18日時点の情報です。

ダウンロード

以下のページから最新版をダウンロードしてください。

https://www.eclipse.org/downloads/

ダウンロード.JPG

インストーラー起動

ダウンロードが終了したら、インストーラーを起動します。

ダウンロードしたexeファイルをダブルクリックして起動します。

インストーラー.JPG

Eclipse IDE for Enterprise Java Developers を選択します。

そのままINSTALLを押してください。

インストール.JPG

Agreementの画面が出てきますが、AcceptNowでOKです。

しばらくすると「Unsigned Content」というダイアログが出るので「Accept」をおします。

Unsigned.JPG

完了したらLaunchボタンを押下しましょう。eclipseが起動します。

launch.JPG

起動

workspaceディレクトリを指定する画面が出ますが、そのままLaunchします。

workspace-select.JPG

Welcomeの画面が出ますがタブの✖を押して閉じちゃいましょう。

これでひとまず準備は完了です。

次回以降、Javaで開発を進めていきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Bootで、テスト実行時にFlywayを走らせない方法

はじめに

現在のプロジェクトで、 SpringBootFlyway を使用していますが、
テスト実行時(当プロジェクトでは Gradleを使用しているため、 ./gradlew test )に、
FlywayMigrate が走ってしまう現象がありました。
その時の解決方法の一つになります。

どのような解決をしたのか

ご存知の方からしたら当たり前のことかもしれませんが、
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

最後に

知っている方からしたらなんてことないことですが、知らない方からしたら若干のハマりポイントではないでしょうか。
そのため、覚書としても記事を記述させていただきました。

短いですが以上です。ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Bootで、単体テスト実行時にFlywayを起動しない方法

はじめに

現在のプロジェクトで、 SpringBootFlyway を使用していますが、
テスト実行時(当プロジェクトでは Gradleを使用しているため、 ./gradlew test )に、
FlywayMigrate が走ってしまう現象がありました。
その時の解決方法の一つになります。

どのような解決をしたのか

ご存知の方からしたら当たり前のことかもしれませんが、
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

最後に

知っている方からしたらなんてことないことですが、知らない方からしたら若干のハマりポイントではないでしょうか。
そのため、覚書としても記事を記述させていただきました。

短いですが以上です。ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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が注入された後に初期化後に初期化作業がある場合は、初期化メソッドを利用して初期化を進めます。

@PostConstruct

@Slf4j
@Component
public class SimpleBean {

    @PostConstruct
    public void postConstruct() {
        log.info("postConstruct");
    }
}

@PreDestroy

@Slf4j
@Component
public class SimpleBean {

    @PreDestroy
    public void preDestroy() {
        log.info("preDestroy");
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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より後である

参照

クラス Date #compareTo

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む