我只想将generateToken方法应用于令牌字段,但是mapstruct也在强制登录,如何解决这个问题?
@Mapper(uses = MapperGenerateToken.class)
public interface TelemarketerAccountMapper {
TelemarketerAccountMapper INSTANCE = Mappers.getMapper( TelemarketerAccountMapper.class );
@Mapping(expression = "java(MapperGenerateToken.generateToken(assistant.getLogin()))", target = "token")
@Mapping(source = "assistant.login", target = "login")
AuthenticatedTelemarketerAccount map(TelemarketerAccount assistant);基因编码:
@Override
public AuthenticatedTelemarketerAccount map(TelemarketerAccount assistant) {
if ( assistant == null ) {
return null;
}
AuthenticatedTelemarketerAccount authenticatedTelemarketerAccount = new AuthenticatedTelemarketerAccount();
authenticatedTelemarketerAccount.setLogin( MapperGenerateToken.generateToken( assistant.getLogin() ) );
authenticatedTelemarketerAccount.setToken( MapperGenerateToken.generateToken(assistant.getLogin()) );
return authenticatedTelemarketerAccount;
}发布于 2022-09-30 06:28:07
MapStruct具有重用通过Mapper#uses定义的其他映射中定义的用户定义映射的概念。
有两种方法可以解决这个问题:
限定符的使用
在MapperGenerateToken#generateToken方法中,您可以使用MapStruct @Named注释,并在映射中使用它。
例如:
public class MapperGenerateToken {
@Named("generateToken")
public static String generateToken(String login) {
// your custom logic
}
}@Mapper(uses = MapperGenerateToken.class)
public interface TelemarketerAccountMapper {
TelemarketerAccountMapper INSTANCE = Mappers.getMapper( TelemarketerAccountMapper.class );
@Mapping(target = "token", source = "login", qualifiedByName = "generateToken")
AuthenticatedTelemarketerAccount map(TelemarketerAccount assistant);
}这将生成您期望的代码。
注意:不需要第二个@Mapping,因为MapStruct会自动检测登录的映射。
Mapper#imports的使用
如果仍然希望使用表达式,则可以使用Mapper#imports告诉MapStruct只导入该类,而不使用它查找映射方法。
例如:
@Mapper(uses = MapperGenerateToken.class)
public interface TelemarketerAccountMapper {
TelemarketerAccountMapper INSTANCE = Mappers.getMapper( TelemarketerAccountMapper.class );
@Mapping(target = "token", expression = "java(MapperGenerateToken.generateToken(assistant.getLogin()))")
AuthenticatedTelemarketerAccount map(TelemarketerAccount assistant);
}我强烈建议使用第一种使用限定符的方法。
https://stackoverflow.com/questions/73901213
复制相似问题