前回の続き
http://qiita.com/kentama/items/09a8573bd5d0831b470e
http://qiita.com/kentama/items/55c71ca28f0c5af8d4ed
型変換とフォーマット
int -> String のようにマッピング時に型変換を行うことができる。
その際に、フォーマットの指定を行うこともできる。
public class Hoge {
private String date;
private String number;
// constructor/getter/setter
}
public class Fuga {
private LocalDate date;
private int number;
// constructor/getter/setter
}
Mapperの作成
@Mapper
public interface ConversionMapper {
ConversionMapper INSTANCE = Mappers.getMapper(ConversionMapper.class);
@Mapping(target = "date", source = "date", dateFormat = "yyyy年MM月dd日") // (1)
@Mapping(target = "number", source = "number", numberFormat = "#,###") // (2)
Hoge convert(Fuga fuga);
}
(1) dateFormat
属性に日付のフォーマットを指定する。
(2) numberFormat
属性に数値のフォーマットを指定する。
実行
Fuga fuga = new Fuga(LocalDate.of(2017, 4, 1), 1234567890);
Hoge hoge = ConversionMapper.INSTANCE.convert(fuga);
System.out.println(hoge.getDate()); // 2017年04月01日
System.out.println(hoge.getNumber()); // 1,234,567,890
リストの型変換
@IterableMapping
を使用することで、リストの型変換もすることができる。
今回は、int -> Stringの変換を行い、3桁のゼロ埋めをする。
Mapperの作成
@Mapper
public interface ConversionMapper {
ConversionMapper INSTANCE = Mappers.getMapper(ConversionMapper.class);
@IterableMapping(numberFormat = "000")
List<String> zeroPadding(List<Integer> numbers);
}
実行
List<String> numbers = ConversionMapper.INSTANCE.zeroPadding(Arrays.asList(1, 2, 56, 76, 863));
System.out.println(numbers); // [001, 002, 056, 076, 863]
Mapperの再利用
Mapperから他のMapperを利用することができる。
MapStructが生成したMapper、または独自に実装したMapperを指定できる。
public class Hoge {
private String date;
// constructor/getter/setter
}
public class Fuga {
private LocalDate date;
// constructor/getter/setter
}
Mapperの作成
今回は LocalDate -> String変換 の独自Mapperを作成し、それを再利用させる。
public class LocalDateMapper {
public String asString(LocalDate date) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
return date != null ? date.format(formatter) : null;
}
}
@Mapper(uses = LocalDateMapper.class) // (1)
public interface InvokingOtherMapper {
InvokingOtherMapper INSTANCE = Mappers.getMapper(InvokingOtherMapper.class);
Hoge fugaToHoge(Fuga fuga);
}
(1) uses
属性に再利用するMapperを指定する。
実行
Fuga fuga = new Fuga(LocalDate.of(2017, 4, 1));
Hoge hoge = InvokingOtherMapper.INSTANCE.fugaToHoge(fuga);
System.out.println(hoge.getDate()); // 2017年04月01日
限定子(Qualifier)の利用
独自に作成したマッピングロジックにアノテーションを付与し、Mapperで独自のマッピングロジックを利用するようにすることができる。
ここでは例として大文字と小文字に変換するマッピングを行う。
public class Hoge {
private String hoge1;
private String hoge2;
// constructor/getter/setter
}
public class Fuga {
public String fuga1;
public String fuga2;
// constructor/getter/setter
}
マッピングロジックの作成
public class Characters {
public String upperCase(String string) {
return (string == null) ? null : string.toUpperCase();
}
public String lowerCase(String string) {
return (string == null) ? null : string.toLowerCase();
}
}
アノテーションの作成
@Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface CharacterConverter {
}
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ToUpper {
}
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ToLower {
}
アノテーションの付与
マッピングロジックに作成したアノテーションを付与する。
@CharacterConverter
public class Characters {
@ToUpper
public String upperCase(String string) {
return (string == null) ? null : string.toUpperCase();
}
@ToLower
public String lowerCase(String string) {
return (string == null) ? null : string.toLowerCase();
}
}
Mapperの作成
@Mapper(uses = Characters.class) // (1)
public interface HogeFugaMapper {
HogeFugaMapper INSTANCE = Mappers.getMapper(HogeFugaMapper.class);
@Mapping(target = "hoge1", source = "fuga1", qualifiedBy = { CharacterConverter.class, ToUpper.class }) // (2)
@Mapping(target = "hoge2", source = "fuga2", qualifiedBy = { CharacterConverter.class, ToLower.class }) // (3)
Hoge fugaToHoge(Fuga fuga);
}
(1) マッピングロジッククラスを指定する
(2)(3) qualifiedBy
属性にマッピングロジッククラスのクラスレベルと、メソッドレベルに指定したアノテーションを指定する。
実行
Fuga fuga = new Fuga("abc", "XYZ");
Hoge hoge = HogeFugaMapper.INSTANCE.fugaToHoge(fuga);
System.out.println(hoge.getHoge1()); // ABC
System.out.println(hoge.getHoge2()); // xyz
続きは次回。