在mapstruct中使用expression进行属性逻辑转换

目录

映射对象

使用Expression实现简单逻辑转换

Mapper接口

编译生成的实现类

使用Expression实现调用静态方法完成转换

Mapper接口

编译生成的实现类

优化写法


映射对象

package example.model;

import lombok.Data;

@Data
public class Source {
	private Integer gender;

}
package example.model;

import lombok.Data;

@Data
public class Target {
	private String gender;

}

使用Expression实现简单逻辑转换

MapStruct提供了expression方式实现带有简单逻辑的转换,以下示例代码就实现一个简单的数字到性别的转换

Mapper接口

package example.mapper;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import example.model.Source;
import example.model.Target;

@Mapper(componentModel = "spring")
public interface DirectExpressionMapper {

	@Mappings({ @Mapping(expression = "java(source.getGender() == 1?\"male\":\"female\")", target = "gender") })
	public Target sourceToTarget(Source source);

}

编译生成的实现类

package example.mapper;

import example.model.Source;
import example.model.Target;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-01-29T15:59:12+0800",
    comments = "version: 1.5.3.Final, compiler: Eclipse JDT (IDE) 1.4.300.v20221108-0856, environment: Java 17.0.3 (Eclipse Adoptium)"
)
@Component
public class DirectExpressionMapperImpl implements DirectExpressionMapper {

    @Override
    public Target sourceToTarget(Source source) {
        if ( source == null ) {
            return null;
        }

        Target target = new Target();

        target.setGender( source.getGender() == 1?"male":"female" );

        return target;
    }
}

使用Expression实现调用静态方法完成转换

MapStruct提供了expression方式实现静态方法的转换,以下示例代码就实现一个简单的数字到性别的转换

Mapper接口

package example.mapper;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import example.model.Source;
import example.model.Target;

@Mapper(componentModel = "spring")
public interface StaticExpressionMapper {

	@Mappings({
			@Mapping(expression = "java(example.util.GenderConverter.convert(source.getGender()))", target = "gender") })
	Target sourceToTarget(Source source);

}

编译生成的实现类

package example.mapper;

import example.model.Source;
import example.model.Target;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-01-29T16:11:13+0800",
    comments = "version: 1.5.3.Final, compiler: Eclipse JDT (IDE) 1.4.300.v20221108-0856, environment: Java 17.0.3 (Eclipse Adoptium)"
)
@Component
public class StaticExpressionMapperImpl implements StaticExpressionMapper {

    @Override
    public Target sourceToTarget(Source source) {
        if ( source == null ) {
            return null;
        }

        Target target = new Target();

        target.setGender( example.util.GenderConverter.convert(source.getGender()) );

        return target;
    }
}

优化写法

为了避免Expression变的又臭又长,声明接口时可以这样写

package example.mapper;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import example.model.Source;
import example.model.Target;
import example.util.GenderConverter;

@Mapper(componentModel = "spring", imports = { GenderConverter.class })
public interface StaticExpressionMapper {

	@Mappings({
			@Mapping(expression = "java(GenderConverter.convert(source.getGender()))", target = "gender") })
	Target sourceToTarget(Source source);

}

编译结果中的工具类就会以import方式引入

package example.mapper;

import example.model.Source;
import example.model.Target;
import example.util.GenderConverter;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-01-29T16:14:34+0800",
    comments = "version: 1.5.3.Final, compiler: Eclipse JDT (IDE) 1.4.300.v20221108-0856, environment: Java 17.0.3 (Eclipse Adoptium)"
)
@Component
public class StaticExpressionMapperImpl implements StaticExpressionMapper {

    @Override
    public Target sourceToTarget(Source source) {
        if ( source == null ) {
            return null;
        }

        Target target = new Target();

        target.setGender( GenderConverter.convert(source.getGender()) );

        return target;
    }
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码司机

源于社区,回馈社区,致敬技术

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值