背景:
随着业务的深入, 越来越多的pojo对象被创建出来, 大量的对象转换再所难免,那么到底有什么工具可以减少频繁的getter/setter呢?
下面为大家推荐几款好用的对象属性拷贝工具:
这个xmind已经把大致的工具都介绍完了, 前面的经常见到的就不再赘述, 我们从Orika开始讲起:
orika: 原本是google开源工具, 16年停止维护了, 用起来还是非常的方便的
下面两个是需要转换的类, 有两个字段名不同, 那么orika是怎么解决这个问题的呢?
package domain;
public class Person {
private String name;
private Integer age;
private String six;
private String code;
private Double height;
.... getter/setter
}
package domain;
import com.googlecode.jmapper.annotations.JGlobalMap;
import com.googlecode.jmapper.annotations.JMap;
public class Student {
private String name;
private Integer age;
private String six;
private Double stature;
private String stuCode;
.... getter/setter
}
我们要完成这两个对象之间的转换:
@Component
public class MapperConverter{
public static final DefaultMapperFactory factory = new DefaultMapperFactory.Builder().build();
@PostConstruct // 这个是在加载servlet的时候加载这个注册文件.大家留意启动日志会发现
public void register() { // 这里设置对应关系, 注意orika是单向映射的, 如果需要从person -> student 需要再配置一个
factory.classMap(Student.class, Person.class)
.field("stature", "height")
.field("stuCode", "code")
.byDefault().register();
}
test:
Person person = MapperConverter.factory.getMapperFacade().map(student, Person.class);
System.out.println(person);
这里奉上orika的工具类:
package com.intime.card.util;
import java.util.HashMap;
import java.util.Map;
import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory.Builder;
import ma.glasnost.orika.metadata.ClassMapBuilder;
import ma.glasnost.orika.metadata.Type;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MapperConverter {
private static final Logger log = LoggerFactory.getLogger(MapperConverter.class);
protected static final MapperFactory factory = new DefaultMapperFactory.Builder().build();
public MapperConverter() {
}
public static MapperFactory getConverter() {
return factory;
}
public static <A, B> ClassMapBuilder<A, B> classMap(Class<A> aType, Class<B> bType) {
return factory.classMap(aType, bType);
}
public static <T> T convert(Object obj, Class<T> tClass) {
return factory.getMapperFacade().map(obj, tClass);
}
public static <S, T> void convert(S s, T t) {
factory.getMapperFacade().map(s, t);
}
static {
factory.getConverterFactory().registerConverter(new CustomConverter<Map<String, Object>, Map<String, Object>>() {
@Override
public Map<String, Object> convert(Map<String, Object> source, Type<? extends Map<String, Object>> destinationType, MappingContext mappingContext) {
return new HashMap(source);
}
});
factory.getConverterFactory().registerConverter(new CustomConverter<Map<Object, Object>, Map<Object, Object>>() {
@Override
public Map<Object, Object> convert(Map<Object, Object> source, Type<? extends Map<Object, Object>> destinationType, MappingContext mappingContext) {
return new HashMap(source);
}
});
}
}
ps: 工具类是抄公司大神的, 拿出来分享一下, 不涉及业务.
之后会持续更新JMapper 和 MapStruct 的 简单用法, 欢迎大家一起讨论. 如果使用的是DDD领域模型的架构的话, 你一定用得到