猿问

如何将 MapStruct 用于不同的数据类型?

我有两种类型的数据要映射:


注册用户Dto:


public class SignUpUserDto {

    private String firstName;

    private String lastName;

    private String username;

    private String email;

    private String password;

    private String title;

}

注册用户:


@Entity

public class SignUpUser {

    private Long id;

    private String firstName;

    private String lastName;

    private String username;

    private String email;

    private String password;

    private Title title;

}

标题:


public enum Title {

    JUNIOR("junior"),

    MIDDLE("middle"),

    SENIOR("senior"),

    MANAGER("manager");


    private final String title;


    Title(final String title) {

        this.title = title;

    }


    public String toString() {

        return this.title;

    }

}

对于DTO title 成员是一个String。


对于实体title 成员是Title。


映射器应该是什么样子的?


我应该传递已经在服务中转换的标题吗?


@Mapper(componentModel = "spring")

public interface SignUpUserMapper {

    SignUpUserMapper INSTANCE = Mappers.getMapper(SignUpUserMapper.class);

    @Mapping(target = "title", expression = "title")

    public SignUpUserDto signUpUserToSignUpUserDto(SignUpUser signUpUser, String title);

    @Mapping(target = "title", source = "title")

    public SignUpUser signUpUserDtoToSignUpUser(SignUpUserDto signUpUserDto, Title title);

}

或者我应该在Mapper中进行转换?


@Mapper(componentModel = "spring",  imports = Title.class)

public interface SignUpUserMapper {

    SignUpUserMapper INSTANCE = Mappers.getMapper(SignUpUserMapper.class);

    @Mapping(target = "title", expression = "java(signUpUser.getTitle().toString())")

    public SignUpUserDto signUpUserToSignUpUserDto(SignUpUser signUpUser);

    @Mapping(target = "title", source = "java(new Title(signUpUserDto.getTitle()))")

    public SignUpUser signUpUserDtoToSignUpUser(SignUpUserDto signUpUserDto);

}


浮云间
浏览 178回答 2
2回答

神不在的星期二

我应该传递已经在服务中转换的标题吗?你绝对不应该这样做。这是转换器的工作,而不是服务的尝试以下方法:1)枚举类添加转换方法enum Title {    ...    public static Title fromString(String title) {        if (title != null) {            for (Title t : Title.values()) {                if (t.toString().equals(title)) {                    return t;                }            }        }        return null;    }}2) Mapper 接口增加2个转换方法(仅限Java 8+)@Mapper(componentModel = "spring")public interface SignUpUserMapper {    SignUpUserDto signUpUserToSignUpUserDto(SignUpUser signUpUser);    SignUpUser signUpUserDtoToSignUpUser(SignUpUserDto signUpUserDto);    default String fromEnum(Title title) {        return title == null ? null : title.toString();    }    default Title toEnum(String title) {        return title == null ? null : Title.fromString(title);    }}

慕码人8056858

像这样使用第二个选项: @Mapper(componentModel = "spring",  imports = Title.class)                     public interface SignUpUserMapper {SignUpUserMapper INSTANCE = Mappers.getMapper(SignUpUserMapper.class);@Mapping(target = "title", expression = "java(signUpUser.getTitle().toString())")public SignUpUserDto signUpUserToSignUpUserDto(SignUpUser signUpUser);@Mapping(target = "title", source = "java(Title.valueOf(signUpUserDto.getTitle().toUpperCase()))")public SignUpUser signUpUserDtoToSignUpUser(SignUpUserDto signUpUserDto);            }
随时随地看视频慕课网APP

相关分类

Java
我要回答