网站如何申请微信支付接口,怎么把网站做漂亮,大学生做网站,打开网页就是2345网址导航文章目录 前言正文一、项目代码1.1 maven依赖1.2 核心配置文件1.3 时间工具类1.4 实体类1.5 转换对象的调用 二、MapperFacade API 前言
众所周知#xff0c;在Java项目中经常会有用到各种对象属性复制的情况#xff0c;以及从一个对象转换为另一个对象。
之前我们可能会使… 文章目录 前言正文一、项目代码1.1 maven依赖1.2 核心配置文件1.3 时间工具类1.4 实体类1.5 转换对象的调用 二、MapperFacade API 前言
众所周知在Java项目中经常会有用到各种对象属性复制的情况以及从一个对象转换为另一个对象。
之前我们可能会使用以下工具
BeanUtils.copyProperties(A, B);MapStruct 对象映射
今天我们来一起看看另一种功能同样强大性能也很高的工具就是Orika MapperFacade。
正文
在SpringBoot项目中我们使用Orika MapperFacade时也是非常方便的。以下会用代码举例。
一、项目代码
项目环境是java1.8使用了Springboot的2.x版本。
1.1 maven依赖
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.feng/groupIdartifactIdmapper-facade-demo/artifactIdversion0.0.1-SNAPSHOT/versionnamemapper-facade-demo/namedescriptionmapper-facade-demo/descriptionpropertiesjava.version1.8/java.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingspring-boot.version2.7.6/spring-boot.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.gitlab.haynes/groupIdartifactIdorika-spring-boot-starter/artifactIdversion1.26.0/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource1.8/sourcetarget1.8/targetencodingUTF-8/encoding/configuration/pluginplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion${spring-boot.version}/versionconfigurationmainClassorg.feng.MapperFacadeDemoApplication/mainClassskiptrue/skip/configurationexecutionsexecutionidrepackage/idgoalsgoalrepackage/goal/goals/execution/executions/plugin/plugins/build/project
1.2 核心配置文件
因为在转换java8的时间类诸如LocalDateTime等时会有格式问题所以增加了类转换器。
package org.feng.config;import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.converter.BidirectionalConverter;
import ma.glasnost.orika.converter.ConverterFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import ma.glasnost.orika.metadata.Type;
import org.feng.util.TimeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.time.LocalDateTime;/*** mapperFacade配置** author feng*/
Configuration
public class MapperFacadeConfig {Beanpublic MapperFactory mapperFactory() {DefaultMapperFactory mapperFactory new DefaultMapperFactory.Builder()// 忽略映射空字段.mapNulls(false).build();ConverterFactory converterFactory mapperFactory.getConverterFactory();// 注册时间转换器converterFactory.registerConverter(new LocalDateTimeStrConverter());return mapperFactory;}Beanpublic MapperFacade mapperFacade(Autowired MapperFactory mapperFactory) {return mapperFactory.getMapperFacade();}private static class LocalDateTimeStrConverter extends BidirectionalConverterLocalDateTime, String {Overridepublic String convertTo(LocalDateTime localDateTime, TypeString type, MappingContext mappingContext) {return TimeUtil.parse(localDateTime);}Overridepublic LocalDateTime convertFrom(String str, TypeLocalDateTime type, MappingContext mappingContext) {return TimeUtil.format(str);}}
}
1.3 时间工具类
package org.feng.util;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** 时间工具类** version v1.0* author: fengjinsong* date: 2024年01月18日 22时40分*/
public class TimeUtil {private static final DateTimeFormatter DATE_TIME_FORMATTER DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);public static String parse(LocalDateTime localDateTime) {if (localDateTime null) {return ;}return DATE_TIME_FORMATTER.format(localDateTime);}public static LocalDateTime format(String dateTime) {if (dateTime null) {return null;}return LocalDateTime.parse(dateTime, DATE_TIME_FORMATTER);}
}
1.4 实体类
为了简化文章篇幅这里将用到的实体类放在了一起。
Data
public class Order {private Long id;private String code;private String type;private String desc;private LocalDateTime createDateTime;
}Data
public class User {private Long id;private String userName;private String email;private LocalDateTime birthday;private LocalDate registerDay;private ListOrder orders;
}Data
public class OrderVO {private Long id;private String code;private String type;private String desc;private String createDateTime;
}Data
public class UserVO {private Long id;private String name;private String email;private String birthday;private LocalDate registerDay;private ListOrderVO orders;
}
1.5 转换对象的调用
为了方便直接在启动类中进行操作。在springboot项目启动后会执行对应的转换代码。
package org.feng;import lombok.extern.slf4j.Slf4j;
import ma.glasnost.orika.BoundMapperFacade;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import org.feng.entity.Order;
import org.feng.entity.User;
import org.feng.vo.UserVO;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;Slf4j
SpringBootApplication
public class MapperFacadeDemoApplication implements CommandLineRunner {Resourceprivate MapperFactory mapperFactory;public static void main(String[] args) {SpringApplication.run(MapperFacadeDemoApplication.class, args);}Overridepublic void run(String... args) throws Exception {// 存在不同字段名映射需要增加映射规则字段名完全相同时可以直接获取mapperFacade实例进行转换mapperFactory.classMap(User.class, UserVO.class).field(userName, name).byDefault().register();BoundMapperFacadeUser, UserVO mapperFacade mapperFactory.getMapperFacade(User.class, UserVO.class);User user new User();user.setUserName(玑而);user.setId(2L);user.setBirthday(LocalDateTime.now());user.setRegisterDay(LocalDate.of(2023,12,21));ListOrder orders new ArrayList();Order order new Order();order.setCreateDateTime(LocalDateTime.now());order.setId(21L);order.setCode(323d2);orders.add(order);user.setOrders(orders);UserVO userVO mapperFacade.map(user);log.info(userVO.toString());}
}
控制台输出
UserVO(id2, name玑而, emailnull, birthday2024-01-31 11:47:50, registerDay2023-12-21, orders[OrderVO(id21, code323d2, typenull, descnull, createDateTime2024-01-31 11:47:50)])二、MapperFacade API
map(…) 普通对象转换mapAsArray(…) 数组转换为数组mapAsCollection(…) 集合转换为集合mapAsList(…) 转换listmapAsSet(…) 转换setmapAsMap(…) 转换mapnewObject(…) 创建一个新对象
另外需要注意一下MapperFacade本身是使用递归的方式去做的。 也就是说如果你要转换的对象内嵌套了其他对象也是可以复制的。