MapStruct処理JavaにおけるEnumタイプの使用と例の列挙

5028 ワード

要旨:MapStructが得意なのは、JavaのEnumタイプ変換など、特殊な場合のjava bean間変換を処理することです.MapStructの簡単な使用方法を学習した後,より複雑なビジネス状況を探索することができる.
一般列挙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になります.
プロジェクトコードはコードクラウドに管理されています.