为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2023-05-10 14:03:44
我有两种类型的数据要映射:注册用户Dto:public class SignUpUserDto {    private String firstName;    private String lastName;    private String username;    private String email;    private String password;    private String title;}注册用户:@Entitypublic 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);}
查看完整描述

2 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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


你绝对不应该这样做。这是转换器的工作,而不是服务的


尝试以下方法:


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);

    }

}


查看完整回答
反对 回复 2023-05-10
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

像这样使用第二个选项:


 @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);            

}


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信