Java学习记录--ModelMapper的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习记录--ModelMapper的使用相关的知识,希望对你有一定的参考价值。

参考技术A 标签(空格分隔): java

在项目中很多时候需要把Model和DTO两个模型类来回转换,保证Model对外是隐私的,同时类似密码之类的属性也能很好地避免暴露在外了.
那么ModelMapper就是为了方便转换而实现的一个类库,下面根据使用场景不断增加案例.

ModelMapper这个工具的入口类就是ModelMapper,因此转换就需要从这个类入口.简单看下API

这里转换替换是根据字段名匹配也就是当User和UserDTO中的字段名称一样就会自动转换.

自定义有很多转换,比如 Provider , Converter , Condition , PropertyMap 等,下面是个综合的例子.

对应的输出是:

分析下:
Provider , Converter , Condition 三个都算是转换前奏,所有的转换规则都是在 PropertyMap 里面配置.所以分析这个里面的配置即可.

1.using(toUppercase).map(source.getNickname(),destination.getHonor());//使用自定义转换规则
首先 toUppercase 是一个 Converter ,也就是sources的nickname会经过这个转换器,然后才设置到destination的honor中.
2.with(personProvider).map(source.getHonor(),destination.getNickname());//使用自定义属性提供覆盖
personProvider 类似一个Bean工厂,当使用这个的时候,对于sources调用getHonor()的时候实际上是调用personProvider的get方法.所以结果 nickname='自定义提供者'
3.map(source.getAvatar()).setAvatar(null);//主动替换属性
可以主动重设某些属性
4.skip(destination.getEmail());
过滤指定属性
5.when(gt2).map().setId(1L);//条件过滤属性
条件过滤属性,当满足 gt2 的时候才会调用setId方法.

对于集合的映射,因为泛型擦除的存在,所以需要告诉ModelMapper要转换的类型,所以就有了 TypeToken 这个类.

这个是最近做项目遇到的一个问题.
比如PageInfo里面包含了一些分页信息,和一个结果集,其中结果集是集合,我想把左边转换为右边.找了些资料,没发现特别好的办法,现在是额外定义转换器,专门对内部的List进行转换.

目前就使用到了这些,用到其他功能再去研究下,官网有不少地方写的不是很明确,导致看的稀里糊涂的,主要是例子太少了,等用的多了再更新.

零碎的java知识点记录

小知识点

  1. Map有getOrDefault("1","0");取不到取默认值
  2. 两个不同对象,属性相同进行赋值转换,使用modelMapper
<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>1.1.0</version>
</dependency>
  1. controller请求中BindingResult bindingResult通过bindingResult.hasErrors()判断是否报错,下列模板代码可以学习
/**
 * 新增房源接口
 * @param houseForm
 * @param bindingResult
 * @return
 */
@PostMapping("admin/add/house")
@ResponseBody
public ApiResponse addHouse(@Valid @ModelAttribute("form-house-add") HouseForm houseForm, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return new ApiResponse(HttpStatus.BAD_REQUEST.value(), bindingResult.getAllErrors().get(0).getDefaultMessage(), null);
    }

    if (houseForm.getPhotos() == null || houseForm.getCover() == null) {
        return ApiResponse.ofMessage(HttpStatus.BAD_REQUEST.value(), "必须上传图片");
    }

    Map<SupportAddress.Level, SupportAddressDTO> addressMap = addressService.findCityAndRegion(houseForm.getCityEnName(), houseForm.getRegionEnName());
    if (addressMap.keySet().size() != 2) {
        return ApiResponse.ofStatus(ApiResponse.Status.NOT_VALID_PARAM);
    }

    ServiceResult<HouseDTO> result = houseService.save(houseForm);
    if (result.isSuccess()) {
        return ApiResponse.ofSuccess(result.getResult());
    }

    return ApiResponse.ofSuccess(ApiResponse.Status.NOT_VALID_PARAM);
}
@NotNull(message = "大标题不允许为空!")
@Size(min = 1, max = 30, message = "标题长度必须在1~30之间")
private String title;

@NotNull(message = "必须填写卧室数量")
@Min(value = 1, message = "非法的卧室数量")
private Integer room;

@NotNull(message = "必须选中一个租赁方式")
@Min(value = 0)
@Max(value = 1)
private Integer rentWay;

@Size(max = 255)
private String description;
  1. redis管理session配置
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400)
public class RedisSessionConfig {
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {

        return new StringRedisTemplate(factory);
    }
}
<!-- redis session依赖 -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
# session会话存储类型
spring.session.store-type=redis

以上是关于Java学习记录--ModelMapper的使用的主要内容,如果未能解决你的问题,请参考以下文章

ModelMapper 中高级使用 java

java ModelMapper使用

java~modelMapper需要注意的几点

ModelMapper:在运行时映射抽象类

spring和mybatis集成,自动生成modelmapper,增加mybatis分页功能

ModelMapper 一文读懂