MapStruct処理JavaにおけるEnumタイプの使用と例の列挙
5028 ワード
要旨:MapStructが得意なのは、JavaのEnumタイプ変換など、特殊な場合のjava bean間変換を処理することです.MapStructの簡単な使用方法を学習した後,より複雑なビジネス状況を探索することができる.
一般列挙Enum変換
ソリッドモデル
Userオブジェクトがあり、属性レベル(grade)は列挙タイプです.
UserDaoオブジェクトがあり、属性レベル(level)は列挙タイプです.
MapStrut変換
UserをUserDaoに変換するには、2つのエンティティの列挙値が同じで、名前が異なり、マッピング関係を構成するだけです.
テストしてみる
結果:
列挙値が異なるエンティティ変換
ソリッドモデル
UserDojoオブジェクトがあり、属性レベル(grade)は列挙タイプです.
MapStrut変換
UserをUserDojoに変換し、両エンティティの列挙値に対応関係があり、UserのGradeタイプAVERAGE、BRONZE、GOLD、DIAMONDはそれぞれUserDojoのRANKタイプNORMAL、JUNIOR、SENIOR、MASTERに対応する.
テストしてみる
結果:
プロジェクトコードはコードクラウドに管理されています.
一般列挙Enum変換
ソリッドモデル
Userオブジェクトがあり、属性レベル(grade)は列挙タイプです.
public class User {
public enum Grade{
AVERAGE,BRONZE,GOLD,DIAMOND;
}
private Grade grade;
// setters, getters, toString()
}
UserDaoオブジェクトがあり、属性レベル(level)は列挙タイプです.
public class UserDao {
public enum Level{
AVERAGE,BRONZE,GOLD,DIAMOND;
}
private Level level;
// setters, getters, toString()
}
MapStrut変換
UserをUserDaoに変換するには、2つのエンティティの列挙値が同じで、名前が異なり、マッピング関係を構成するだけです.
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mappings({
@Mapping(source="grade", target="level")
})
UserDao userToUserDao(User user);
}
テストしてみる
@Test
public void test1(){
User user = new User();
user.setGrade(Grade.DIAMOND);
UserDao e = UserMapper.INSTANCE.userToUserDao(user);
System.out.println(e);
}
結果:
UserDao [level=DIAMOND]
簡単な列挙変換はあまり構成を必要とせず,MapStrutはEnumタイプを自動的に処理できる.列挙値が異なるエンティティ変換
ソリッドモデル
UserDojoオブジェクトがあり、属性レベル(grade)は列挙タイプです.
public class UserDojo {
public enum RANK{
NORMAL,JUNIOR,SENIOR,MASTER;
}
private RANK rank;
// setters, getters, toString()
}
MapStrut変換
UserをUserDojoに変換し、両エンティティの列挙値に対応関係があり、UserのGradeタイプAVERAGE、BRONZE、GOLD、DIAMONDはそれぞれUserDojoのRANKタイプNORMAL、JUNIOR、SENIOR、MASTERに対応する.
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mappings({
@Mapping(source="grade", target="rank")
})
UserDojo userToUserDojo(User user);
@ValueMappings({
@ValueMapping(source="AVERAGE",target="NORMAL"),
@ValueMapping(source="BRONZE",target="JUNIOR"),
@ValueMapping(source="GOLD",target="SENIOR"),
@ValueMapping(source="DIAMOND",target="MASTER"),
@ValueMapping(source=MappingConstants.ANY_UNMAPPED, target=MappingConstants.NULL)
})
RANK customConveter(Grade grade);
}
テストしてみる
@Test
public void test1(){
User user = new User();
user.setGrade(Grade.DIAMOND);
UserDojo u = UserMapper.INSTANCE.userToUserDojo(user);
System.out.println(u);
}
結果:
UserDojo [rank=MASTER]
Enum値をマップするcustomConverter()メソッドをカスタマイズし、@Value Mapping注記を使用しました.最後の行にはMapStructの定数も使用され、マッピングに失敗した場合のデフォルト値はnullになります.プロジェクトコードはコードクラウドに管理されています.