В настоящее время невозможно передать используемый маппер или сервис методу по умолчанию.Для этого есть 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
или с помощью выражения.
С выражением это может выглядеть так:
@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);
}