【MapStruct】 @MappingConfig で共通設定
@MappingConfig
でMapperの共通設定をするConfigクラスを作成できる。
環境
Configクラスの作成
@MapperConfig(unmappedTargetPolicy = ReportingPolicy.IGNORE , nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL , mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG) public interface ShareConfig { }
Mapperの作成
config
属性に作成したConfigクラスを設定する。
@Mapper(config = ShareConfig.class) public interface PersonMapper { // omit... }
【MapStruct】Mappingを継承する
@InheritConfiguration
または @InheritInverseConfiguration
を使うことでマッピングを継承することができる。
環境
Mapperの作成
@Mapper public interface PersonMapper { PersonMapper MAPPER = Mappers.getMapper(PersonMapper.class); @Mapping(target = "emailAddress", source = "email") Person toPerson(PersonEntity entity); @InheritConfiguration Person toPersonInherit(PersonEntity entity); }
テストコード
@Test public void test() { PersonEntity entity = new PersonEntity(); entity.setEmail("hoge@example.com"); Person person = PersonMapper.MAPPER.toPersonInherit(entity); assertThat(person.getEmailAddress()).isEqualTo("hoge@example.com"); }
@InheritInverseConfiguration
を使うと、逆向きのマッピングができる。
@Mapper public interface PersonMapper { PersonMapper MAPPER = Mappers.getMapper(PersonMapper.class); @Mapping(target = "emailAddress", source = "email") Person toPerson(PersonEntity entity); @InheritInverseConfiguration PersonEntity toPersonInverse(Person person); }
継承したいマッピングと同様のマッピングが複数定義してある場合は name
にマッピングメソッド名を指定する。
@InheritInverseConfiguration(name = "toPerson") PersonEntity toPersonInverse(Person person);
【MapStruct】Expression を使う
Expressionを使うことで、任意のJavaコードをマッピングの際に実行できる。
環境
Mapperの作成
expression
に実行したいJavaコードを記述する。その際、 java()
で囲む。
@Mapper public interface ExpressionMapper { ExpressionMapper MAPPER = Mappers.getMapper(ExpressionMapper.class); @Mapping(target = "name", expression = "java(org.springframework.util.StringUtils.capitalize(entity.getName()))") Student toStudent(StudentEntity entity); }
テストコード
@Test public void test() { StudentEntity entity = new StudentEntity(); entity.setName("curry"); Student student = ExpressionMapper.MAPPER.toStudent(entity); assertThat(student.getName()).isEqualTo("Curry"); }
expression
にパッケージ名から記述したくない場合は、 imports
を使用して省略することができる。
@Mapper(imports = StringUtils.class) public interface ExpressionMapper { @Mapping(target = "name", expression = "java(StringUtils.capitalize(entity.getName()))") Student toStudent(StudentEntity entity); }