SpringBoot dev-tools vjtools dozer热启动类加载器不相同问题

  最近使用惟品会的vjtools的BeanMapper进行对象的深度克隆转换DTO/VO这种操做,Spring Boot的dev-tools热启动,须要把vjtools和dozer包都放到spring-devtools.properties的incloud里面,不然会出现强转失败的问题,缘由是dev-tools的热启动使用的是restartClassLoader。spring

  若是只把vjtools加到spring-devtools.properties内,对于通常的克隆都没问题,可是对于以下状况,List内的元素会使用AppClassCloader加载:app

  

@Data
public class A {

    private Long id;
    private List<Cc> cc;
    
}
@Data
public class B {

    private Long id;
    private List<Cc> cc;
    
}
public class Dd {
    
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Cc {
        
        private String name;

    }


}
public class CloneTest {
    
    @Test
    public void test1() {
        A a = new A();
        a.setId(100L);
        List<Cc> list = new ArrayList<>();
        list.add(Cc.builder().name("w.dehai").build());
        a.setCc(list);
        Object b = BeanMapper.map(a, B.class);
        System.err.println("原始B类加载器:" + B.class.getClassLoader());
        System.err.println("map以后得到的B类加载器:" + b.getClass().getClassLoader());
        B bb = BeanMapper.map(a, B.class);
        Object m = bb.getCc().get(0);
        System.err.println(m.getClass().getClassLoader()); // 这里会输出AppClassLoader
    }

}

  含有静态内部类的List中的元素通过克隆以后会使用AppClassLoader加载,致使报错。因此须要把vjtools和dozer这2个jar包都加到spring-devtools.properties内。单元测试

  说明:上面代码只是单元测试实例代码,没法重现热加载,若是须要测试,须要在Spring Boot环境中测试。测试

相关文章
相关标签/搜索