mapstruct的用法之qualifiedByName示例详解

网友投稿 1504 2022-08-16


mapstruct的用法之qualifiedByName示例详解

qualifiedByName的意思就是使用这个Mapper接口中的指定的默认方法去处理这个属性的转换,而不是简单的get set。网上一直没找到…

可用于格式化小数位等,在po转换为vo时就已格式化小数位完成,所以不必单独再写代码处理小数位。

1 引用pom1 ,能正常使用mapstruct的注解,但不会生成Impl类

org.mapstruct

mapstruct-jdk8

1.2.0.Final

引用pom2 才会生成Impl类

2 定义ConvertMapper

package com.weather.weatherexpert.common.model.mapper;

import com.weather.weatherexpert.common.model.po.AreaPO;

import com.weather.weatherexpert.common.model.vo.AreaVO;

import org.mapstruct.MapMapping;

import org.mapstruct.Mapper;

import org.mapstruct.Mapping;

import org.mapstruct.Namedhttp://;

import org.mapstruct.factory.Mappers;

import java.text.DecimalFormat;

/**

*

Title:

*

Description:

*

*/

@Mapper

public interface ConvertMapper {

ConvertMapper INSTANCE = Mappers.getMapper(ConvertMapper.class);

@Mapping(source = "pm25", target = "pm25", qualifiedByName = "formatDoubleDef")

AreaVO areaPO2areaVO(AreaPO areaPO);

@Named("formatDoubleDef")//需要起个名字,不然报错,可以与方法名一致,当然也可以不一致

default Double formatDouble(Double source) {

DecimalFormat decimalFormat = new DecimalFormat("0.00");//小数位格式化

if (source == null) {

source = 0.0;

}

return Double.parseDouble(decimalFormat.format(source));

}

}

3 定义源类和目标类

public class AreaPO {

private String cityName;

private Integer haveAir;

private Double pm25;

private String pm10Str;

............

}

public class AreaVO {

private String cityName;

private Integer haveAir;

private Double pm25;

private String pm25Str;

private Double pm10;

......

}

4 看生成的Impl类ConvertMapperImpl

package com.weather.weatherexpert.common.model.mapper;

import com.weather.weatherexpert.common.model.po.AreaPO;

import com.weather.weatherexpert.common.model.vo.AreaVO;

public class ConvertMapperImpl implements ConvertMapper {

public ConvertMapperImpl() {

}

public AreaVO areaPO2areaVO(AreaPO areaPO) {

if (areaPO == null) {

return null;

} else {

AreaVO areaVO = new AreaVO();

areaVO.setPm25(this.formatDouble(areaPO.getPm25()));

areaVO.setCityName(areaPO.getCityName());

areaVO.setHaveAir(areaPO.getHaveAir());

return areaVO;

}

}

5 测试

AreaPO areaPO = new AreaPO("忻州", 1, 1.256879);

AreaVO areaVO =

ConvertMapper.INSTANCE.areaPO2areaVO(areaPO);

logger.info("jsON.toJSONString(areaVO):" + JSON.toJSONString(areaVO));

输出:

JSON.toJSONString(areaVO):{“cityName”:“忻州”,“haveAir”:1,“pm25”:1.26}

关于@Target注解的使用可见:

详解JDK 5 Annotation 注解之@Target的用法介绍


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java十分钟精通进阶适配器模式
下一篇:Mybatis分页的4种方式实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~