小技巧

异步消息处理技巧

需要异步获取结果的数据,通常采用推+拉结合的方式。

  1. “推”是为了保证时效性,推的时候有可能因为一些网络问题失败。

  2. “拉”即定时任务主动拉取,是为了提高容错。

异常信息的记录技巧

  1. 对于一些查询类的错误,一般都可以再次发起请求复现。这样的错误只需要通过日志文件保存即可。

  2. 对于一些表单提交/修改的错误,通常无法复现,只通过日志打印很容易超出日志实效导致无法溯源,因此需要保存到数据库。

DTO/VO转换

注意:对象 范型擦除
* 1.避免直接拷贝泛型容器字段(如 List<T>、Map<K,V>)。
* 2.对泛型字段单独处理:先拷贝外层对象,再手动/工具转换内部元素。
* 3.优先使用 MapStruct:尤其在 DTO/Entity 转换频繁的项目中。

举例

@Slf4j
public class BeanutilCopy {

    @Data
    public static class A {
        private List<Integer> list;
    }

    @Data
    public static class B {
        private List<String> list;
    }

    public static void main(String[] args) throws JsonProcessingException {
        //准备a数据
        List<Integer> as = Collections.singletonList(111);
        A a = new A();
        a.setList(as);
        //copy到b数据
        B b = new B();
        //泛型容器字段spring2.2.5版本能够copy过去,但是无法取出来。spring2.7.15版本无法copy过去。
        BeanUtils.copyProperties(a, b);
        //验证
        System.out.println(a);
        System.out.println(b);
        System.out.println(b.getList());
        //因为范型擦除,对象String指向了int类型,导致java.lang.Integer cannot be cast to java.lang.String
        for (String bi : b.getList()) {
            System.out.println(bi);
        }
    }
}

Last updated

Was this helpful?