はじめに
業務でJavaを使うことになったが、少しブランクがあるため、記事としてまとめる。
背景
Entityでセットされた値を、modelに格納したいと考えた。しかし、modelのsetterを呼び出し、setterの引数にEntityのgetterを呼び出すのは、フィールドの数が多い場合、可読性に欠けると考え、わざわざ上記のようなことをしなくてもmodelに格納することが出来ないかと思った経由から始まった。
実装
ちなみに、lombokを使用しているため、setterとgetterは記載していない。
DBから取得・格納済みのEntityクラス
Entity.java
@Getter
@Setter
@Entity
public class Entity {
private String entityStringA;
private String entityStringB;
private String entityDateTime;
}
Entityクラスからセットするmodelクラス
Model.java
@Getter
@Setter
@Entity
public class Model {
private String modelStringA;
private String modelStringB;
private DateTime modelDateTime;
}
変換する処理
int id = 1;
Entity entity = xxx.fetchXxx(id);
// entityクラスに格納された値がmodelにセットされる
Model model = modelMapper.map(entity, Model.class);
// entityDateTimeからmodelDateTimeを格納しているが、型がStringからDateTime
// にしているが、String⇒DateTimeと型変換をしてくれる
EntityとModelのフィールド名が同じ場合は以下クラスは不要だが、今回のようにフィールド名を変更したい場合、以下設定クラスを作成する必要がある。
app/comfig/ModelMapperConfig
@Configuration
public class ModelMapperConfig {
@Bean
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setAmbiguityIgnored(true);
convert(modelMapper);
return modelMapper;
}
private void convert(ModelMapper modelMapper) {
TypeMap<RecruitmentDetail, JobPosting> mapperTypeMap =
modelMapper.createTypeMap(Entity.class, Model.class);
// mapper.mapの第一引数に取得対象の値のgetterを指定
// mapper.mapの第二引数にセット対象の値のsetterを指定
mapperTypeMap.addMappings(mapper -> {
mapper.map(Entity::getEntityStringA, Model::setModelStringA);
mapper.map(Entity::getEntityStringB, Model::setModelStringB);
mapper.map(Entity::getEntityDateTime, Model::setModelDateTime);
});
}
}