weblog@kentama

技術的なメモ置き場。主にJava。

Java

【MapStruct】BeforeMappingとAfterMapping

BeforeMappingとAfterMappingでマッピング前後の処理を追加できる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapperの作成 @Mapper public abstract class PersonMapper { @BeforeMapping protected void before(PersonEntity …

【MapStruct】Decoratorを使う

Decoratorを使うことでマッピングをカスタマイズすることができる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapperの作成 @DecoratedWith にDecoratorクラスを指定する。 @Mapper @DecoratedWith(PersonMapperDecorator.class…

【MapStruct】 @MappingConfig で共通設定

@MappingConfig でMapperの共通設定をするConfigクラスを作成できる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Configクラスの作成 @MapperConfig(unmappedTargetPolicy = ReportingPolicy.IGNORE , nullValueMappingStrategy …

【MapStruct】Mappingを継承する

@InheritConfiguration または @InheritInverseConfiguration を使うことでマッピングを継承することができる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapperの作成 @Mapper public interface PersonMapper { PersonMapper M…

【MapStruct】Expression を使う

Expressionを使うことで、任意のJavaコードをマッピングの際に実行できる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapperの作成 expression に実行したいJavaコードを記述する。その際、 java() で囲む。 @Mapper public int…

【MapStruct】デフォルト値と定数を設定する

マッピングする値がnullの場合のデフォルト値と定数の設定ができる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapperの作成 デフォルト値は defaultValu, 定数は constant に指定する。 @Mapper public interface DefaultConst…

【MapStruct】Object Factory を使う

Object Factoryを使って、マッピングするオブジェクトを生成することができる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Object Factoryの作成 public class StudentFactory { public Student createStudent() { Student stude…

【MapStruct】 Enum同士のマッピング

Enumを違う型のEnumに変換することができる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapperの作成 @ValueMapping でマッピングする識別子を指定する。 @Mapper public interface SizeMapper { SizeMapper MAPPER = Mappers.g…

【MapStruct】 @Qualifierを使う

@Qualifier を使うことでアノテーションで独自の変換処理を追加することができる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 変換するクラスを用意する public class Characters { public String upperCase(String string) { re…

【MapStruct】@Context を使う

@Context パラメータを使用して、独自のカスタムメソッドを使用することができる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapper @Mapper public interface ContextMapper { ContextMapper MAPPER = Mappers.getMapper(Conte…

【MapStruct】参照型オブジェクトのマッピング

ネストされた参照型クラスのマッピングメソッドがある場合は、自動的にネストしているクラスのマッピングでそのマッピングが使用される。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 Mapper StudentにネストされているPersonのマ…

Spring Test DBUnitでJSONカラムにデータを投入する

Spring Test DBUnitで @DatabaseSetup を使用してテストデータを投入する際に、対象のテーブルにJSONカラムが存在すると失敗するが、PostgresqlDataTypeFactoryを拡張することで投入できるようになる。 環境 Spring Boot 1.4.1 Spring Boot Test Starter Spr…

【MapStruct】暗黙的な型変換

今回は暗黙的な型変換についてまとめる。 異なる型のフィールドにマッピングする際に暗黙的な型変換が行われる。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 使用するBean public class Dto { private int intValue; private long…

【MapStruct】コンポーネントモデルを指定する

Mapperのコンポーネントモデルを指定することができる。 今回はSpring FrameworkでDIできるようにする。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 @Mapper のcomponentModel属性を使う @Mapper のcomponentModel属性に spring …

【MapStruct】Beanマッピング(基本編)

基本編。 環境 MapStruct : 1.2.0.Final Java : 9 JUnit : 4.12 AssertJ : 3.9.1 使用するBean public class Person { private String name; private int age; // constructor/getter/setter } public class PersonEntity { private String name; private in…

PowerMock + Mockitoでstaticメソッドをモック化

以下のバージョンを使用 PowerMock:1.7.3 Mockito:2.8.9 // モック化するクラス public class StaticFoo { public static String staticMethod() { return "bar"; } } // テストケース @RunWith(PowerMockRunner.class) // 1 @PrepareForTest(StaticFoo.clas…

Java9 interfaceクラス

Java9でinterfaceクラスにprivateメソッドを定義できるようになった。 interface Foo { private String bar() { return "bar"; } // オーバーロードもOK private String bar(String baz) { return baz; } // staticメソッドもOK private static void qux() {…

Java9 try-with-resource文

Java9ではtry-with-resource文で、try句でのリソースの変数を宣言しなくてもよくなった。 FileInputStream is = new FileInputStream("foo"); try (is) { // omit } catch (Exception e) { } // Java8 try (FileInputStream is = new FileInputStream("foo")…

Java9 匿名クラスでダイヤモンド演算子

Java9で匿名クラスにダイヤモンド演算子が使えるようになった。 List<String> list = new ArrayList<>() {}; // Java8だとパラメータの型を明示的に指定する必要がある List<String> list = new ArrayList<String>() {};</string></string></string>

Java9 Stream APIの追加メソッド

Java9の新機能を試す。今回はStream APIの追加メソッド。 takeWhile(Predicate predicate) predicateのtestメソッドがtrueを返すまで要素を取得する。 // 1, 2を出力 List.of(1, 2, 3, 4, 5).stream() .takeWhile(i -> i != 3).forEach(System.out::println)…

Java9 Optionalの追加メソッド

Java9の新機能を試す。 今回はOptionalに追加されたメソッド。 ifPresent(Consumer action) 値が存在する場合のみactionを実行する。 // Foo が出力される Optional.ofNullable("Foo").ifPresent(System.out::println); // 何も出力されない Optional.ofNull…

Java9 コレクションのファクトリメソッド

Java9の新機能を試す。 今回はコレクションのファクトリメソッド。 生成されるオブジェクトはイミュータブル。 List List.of(1, 2, 3); // nullを含むとエラー List.of(null); Map keyとvalueを交互に指定する。 Map.of("foo", 1, "bar", 2); // keyが重複す…

VS CodeでSpring Boot

VS CodeのチュートリアルにSpring Bootがあったので試してみた。 code.visualstudio.com 事前準備 VSCodeのインストール JDKのインストール(今回はversion 1.8.151) 環境変数JAVA_HOMEの設定 Mavenのインストール 拡張機能 VS CodeにJava Extension Packをイ…

macでJAVA_HOMEを設定する

.bash_profile に以下を追記する。 export JAVA_HOME=`/usr/libexec/java_home -v 1.8` -v 9 を指定するとJava9を指定できる。 $ source ~/.bash_profile $ echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home

【Java】 Stringのおさらい

Stringのおさらい。知らなかった仕様もあったので油断ならない。 ※ 一部省略している部分もある コンストラクタ 引数なし new String(); // "" バイト配列 byte[] bytes = "abcde".getBytes(); new String(bytes); // abcde new String(bytes, 1, 2); // bc …

【Java】try-catch-finally文

try-catch-finally文の順序は変えられない。 // OK try {} catch(Exception e) {} finally{} // NG try {} finally{} catch(Exception e) {} // NG try {} finally {} finally {} catchブロックとfinallyブロックにreturnがあった場合どうなるか? try { // …

【Java】for文

for文は、初期化文・条件文・更新文・繰り返し処理で構成される。 for (初期化文; 条件文; 更新文) { 繰り返し処理; } 初期化文と更新文は複数記述できる。 初期化文で宣言できるのは同じ型の変数。 for (int i = 0, j = 0; true; i++, j++) {} // 更新文で…

【Java】識別子

Javaの識別子(変数、メソッド名、クラス名など)には、以下の規則がある。 予約語は使用不可 数字から始められない 下記の記号以外の記号は使用不可 アンダースコア 通貨記号 通貨記号を使ってみると以下のようになる int ¤ = 1; // 国際通貨記号 int ฿ = 2…

【Java】クラス宣言

Javaのクラス宣言は、 フィールド と メソッド の2つから構成される。 パッケージ宣言、インポート宣言は含まれない。 これらはソースファイルに対する宣言であり、クラスに対するものではない。 // パッケージ -> クラス宣言ではない package chapter01; //…

Comparatorでソート

Comparatorを使用して、JavaBeanのリストをソートする。 使用するJavaBean public class Student { private int id; private String name; private int age; // getter/setter } 今回、Studentに設定するデータはJSONで定義する。 JSON -> Java Objectの変換…