java - 强制 MapStruct 使用自定义方法而不是 dto 值
问题描述
我有一个要映射的 UserDTO 和 User 实体。创建新用户时,某些字段(例如:password
, modifiedBy
)必须通过某种自定义方法生成(例如:password
随机生成和编码,但modifiedBy
用户名是从安全服务中检索的)。为此,我将一些服务自动连接到映射器中。它们中的许多返回String
并且 MapStruct 无法理解在每种情况下使用哪个,而只是使用它在所有接受String
作为输入的东西上找到的第一个。
@Mapper(componentModel = "spring", uses = PasswordEncoder.class)
public interface UserMapper {
@Mapping(target = "password", qualifiedByName = "PASS")
User mapUser(UserDto dto);
@Named("PASS")
default String getPass(PasswordEncoder passwordEncoder){
return passwordEncoder.encode(some_random_generator);
}
}
这会生成仅使用PasswordEncoder
任何接受的 setter 中的方法的代码,String
并且getPass(...)
根本不使用方法。但是我需要它只在现场使用我的getPass(...)
方法。password
解决方案
目前无法将使用的映射器或服务传递给默认方法。为此打开了mapstruct /mapstruct#1637。你也不能真正这样做@Mapper( uses = PasswordEncoder.class )
,因为这会导致所有内容String
都String
通过PasswordEncoder
. 但是,您可以做的是创建自己的自定义PasswordEncoderMapper
并@Named
在其上使用,这样您就可以控制。
这看起来像这样:
@Qualifier // org.mapstruct.Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface EncodedMapping {
}
public class PasswordEncoderMapper {
protected final PasswordEncoder passwordEncoder;
public PasswordEncoderMapper(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@EncodedMapping
public String encode(String value) {
return passwordEncoder.encode(value);
}
}
@Mapper(componentModel = "spring", uses = PasswordEncoderMapper.class)
public interface UserMapper {
@Mapping(target = "password", qualifiedBy = EncodedMapping.class)
User mapUser(UserDto dto);
}
关于modifiedBy
财产。您应该将其作为@ObjectFactory
or 的一部分使用表达式。
使用表达式可以如下所示:
@Mapper(componentModel = "spring", uses = PasswordEncoderMapper.class, imports = SecurityUtils.class)
public interface UserMapper {
@Mapping(target = "password", qualifiedBy = EncodedMapping.class)
@Mapping(target = "modifiedBy", expression = "java(SecurityUtils.getCurrentUserId())")
User mapUser(UserDto dto);
}
推荐阅读
- javascript - 参考资料及其在 JavaScript 中的工作方式
- javascript - 如何使用 ngx-datatable 和 angular 使用分页 ID 显示分页结果?
- ipython - Graphviz 在 Python Idle 中不显示 PNG
- javascript - 导出类的变体
- swift - 编译器无法对该表达式进行类型检查
- python - Scrapy Request 没有抓取所有返回的 url
- php - Wordpress:带有过滤器的存档页面不起作用(ACF)
- npm - 如何在 npm 中创建多个包?
- base64 - Base64 编码 OpenType 字体使用数据 URI,从计算机动态输入用户
- java - 我正在尝试安装我克隆的 apache-storm 存储库。并且在到达storm-client 时收到以下错误。如何解决这个问题?