我只想将generateToken方法应用到Token字段,但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;
}
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);
}
我强烈建议使用第一种使用限定符的方法。