当前无法将使用的映射器或服务传递给默认方法。有
mapstruct/mapstruct#1637
打开它。你也不能真的这么做
@Mapper( uses = PasswordEncoder.class )
因为这会导致所有
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
或者使用表达式。
通过表达式,可以看到:
@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);
}