跳至主要内容

Orika使用示例

Orika使用示例

简述

在项目中使用过不少Java Bean映射(Java Bean属性拷贝)类库,比如Apache和Spring的BeanUtilscglibBeanCopier等。
Apache和Spring的BeanUtils没有对list拷贝的内置支持,对属性不同类型的转换也缺乏默认的支持,需要做不少封装。
cglibBeanCopier的API相对来说比较难使用,虽然速度极快,但需要做更多的封装,可读性不好。

综合下来,发现Orika能较好的满足各项常见的Java Bean映射需求。

使用实例

在实际使用中,通常可以把Orika封装成一个静态工具类,示例如下:

public class BeanMapperUtils {

    private static final DefaultMapperFactory mapperFactory ;
    
    private static final MapperFacade mapper;
    
    static {
        mapperFactory = new DefaultMapperFactory.Builder().build();
        mapper = mapperFactory.getMapperFacade();
    }


    public static <S, D> D map(S s, Class<D> aClass) {
        return mapper.map(s, aClass);
    }

    public static <S, D> List<D> mapAsList(Iterable<S> iterable, Class<D> aClass) {
        return mapper.mapAsList(iterable, aClass);
    }

}

MapperFactoryMapperFacade都是线程安全的,可以使用单例模式。详情可参考官方文档Use the MapperFactory as a singleton章节。

静态工具类的方法使用委托模式,可以根据需求,只委托一些常用的方法。

示例实体类:

public class Customer {

    private Long id;

    private String name;

    private Date birthday;

    //省略 getter setter...

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}
public class CustomerDTO {

    private Long customerId;

    private String name;

    private String birthday;

 //省略 getter setter...

    @Override
    public String toString() {
        return "CustomerDTO{" +
                "customerId=" + customerId +
                ", name='" + name + '\'' +
                ", birthday='" + birthday + '\'' +
                '}';
    }
}

常用简单示例

@Test
public void commonBeanMapperTest(){
    Customer c = new Customer();
    c.setName("foo1");

    CustomerDTO dto = BeanMapperUtils.map(c, CustomerDTO.class);
    Assert.assertEquals(dto.getName(), c.getName());
    System.out.println(c.getName());
}

结果没有异常,输出为:foo1

List转换示例

@Test
    public void listMapperTest(){
        Customer c = new Customer();
        c.setName("foo1");

        Customer c2 = new Customer();
        c2.setName("foo2");

        ArrayList<Customer> list = new ArrayList<>();
        list.add(c);
        list.add(c2);
        List<CustomerDTO> dtoList = BeanMapperUtils.mapAsList(list, CustomerDTO.class);

        System.out.println(list);
        System.out.println(dtoList);
    }

输出结果:

[Customer{id=null, name='foo1', birthday=null}, Customer{id=null, name='foo2', birthday=null}]

[CustomerDTO{customerId=null, name='foo1', birthday='null'}, CustomerDTO{customerId=null, name='foo2', birthday='null'}]

日期转换示例

Date与String之间的互转,需要注册一个的转换器,可以在初始化MapperFactory时注册全局转换器:

mapperFactory.getConverterFactory().registerConverter(new DateToStringConverter("yyyy-MM-dd HH:mm:ss"));

DateToStringConverter为内置的双向转换器,可配置时间格式,也可以自定义转换器,这里使用内置转换器。示例:

public void dateMapperTest(){
        Customer c = new Customer();
        c.setBirthday(new Date());

        CustomerDTO cdto = new CustomerDTO();
        cdto.setBirthday("2019-12-12 08:00:00");


        CustomerDTO dto = BeanMapperUtils.map(c, CustomerDTO.class);
        System.out.println(c.getBirthday());
        System.out.println(dto.getBirthday());

        Customer customer = BeanMapperUtils.map(cdto, Customer.class);
        System.out.println(customer.getBirthday());
        System.out.println(cdto.getBirthday());
    }

输出结果:

Sat Dec 07 16:21:58 CST 2019
2019-12-07 16:21:58
Thu Dec 12 08:00:00 CST 2019
2019-12-12 08:00:00

属性名不一致的情况的转换示例

属性名不一致的情况,需要注册转换类的属性名映射,以在初始化MapperFactory时注册:

mapperFactory.classMap(Customer.class, CustomerDTO.class)
                .field("id", "customerId")
                .byDefault()
                .register();

field方法可以注册多个属性名的映射。转换示例:

@Test
    public void fieldMapperTest(){
        Customer c = new Customer();
        c.setId(666L);

        CustomerDTO dto = BeanMapperUtils.map(c, CustomerDTO.class);
        System.out.println(c.getId());
        System.out.println(dto.getCustomerId());
    }

输出结果:

666
666

参考

官方文档:http://orika-mapper.github.io/orika-docs/index.html

评论

此博客中的热门博文

国密SM2签名封装成PKCS7格式

在国内做金融行业,难免会有被强制使用国密算法的情况,而且一般还会指定必须使用硬件加密机之类的设备,所以我也稍微的研究了一下国密算法,使用软算法签名并封装 PKCS7 格式(文档中的一个交互)。 以下是基于 Bouncy Castle 的示例,密钥对的生成可以参考 Bouncy Castle 中 test 包下 SM2 相关代码 public static String sign ( ) throws Exception { //加载公钥 byte [ ] plainText = "hello, world" . getBytes ( ) ; FileInputStream input = new FileInputStream ( "F:\\certificate\\public.cer" ) ; CertificateFactory certificateFactory = new CertificateFactory ( ) ; X509Certificate certificate = ( X509Certificate ) certificateFactory . engineGenerateCertificate ( input ) ; input . close ( ) ; //加载私钥,private为换成实际的私钥 PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec ( "private" . getBytes ( ) ) ; //SM2算法实际上为ECC算法,并指定了一些参数值,所以这里的参数是EC KeyFactory factory = KeyFactory . getInstance ( "EC" , "BC" ) ; PrivateKey privateKey = factory . generatePrivate ( spec ) ; //以下为签名并封装成PKCS7格式 byte [ ] signedMessag

Spring Boot Actuator 2 示例

Welcome file 简介 Spring Boot Actuator为应用程序提供了各种开箱即用的运维特性,可以与应用方便的交互和监控。 使用环境:Java 11 和 Spring Boot 2.4.3.RELEASE 集成Spring Boot Actuator 在Spring Boot中集成Spring Boot Actuator与集成其他的框架类似,在 pom.xml 里引入相关的starter就可以: < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-actuator </ artifactId > </ dependency > < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-web </ artifactId > </ dependency > 由于大部分的使用场景还是web,所以这里也用Spring MVC做示例。 配置好 pom.xml 后,默认actuator仅暴露一些基本功能,实际使用中,根据需求暴露对应功能。为了简便测试,这里在 application.yml 中配置暴露全部功能: management : endpoints : web : exposure : include : "*" endpoint : health : enabled : true show-details : always probes : enabled : true shutdown : enabled : true metr

NextCloud数据目录迁移

最近服务器的环境坏了,所以迁移了NextCloud的数据目录。不过在迁移过程中有点小问题。 环境: Ubuntu 18.04 Docker 19.03.7 1.NextCloud页面不正常,Docker日志显示XX目录permission denied 参考了 这里 的做法,不过是把  /var/www/html/   整个目录的权限都修改为  chown -R www-data:www-data ,之后就不再报权限问题了。 2.数据库配置修改 因为NextCloud是在初始化时填的数据库连接信息,所以直接迁移数据目录的情况下,会导致应用连不到新的数据库环境。此时可以找到数据目录下的  config/config.php 文件,直接修改数据库连接配置。