前言
在java中,经常碰到bean之间的转换,诸如Entity转VO,Entity转DTO等等,这时,经常会碰到这样一种情况,VO和DTO里面有一个字段都是来源于Entity里面,但是属性名称和属性类型都不一样,虽然转换逻辑一致但是我们还是只能手动转换,这时如果我在代码中手动转换会出现很多多余的代码,而且出现其它Bean也需要转换时还需要连续复制这些代码,那么有什么好的办法来处理呢?
答案肯定是有的,那么接下来我们就看看如何实现这种功能。
例:有一个实体类User,里面有一个枚举字段sex,枚举:【0:女;1:男】
现在有一个接口需要查询用户User的sex名称(需要返回男还是女,查询对象UserVO,字段sexFmt),这时常规下我们只能这样操作:
User user = userMapper.selectById(1L);
UserVO vo = new UserVO();
BeanUtils.copy(user, vo);
vo.setSexFmt(user.getSex()==0?"女":"男");
看似问题似乎也不大,但是如果出现UserDTO和UserQuery等都需要这种操作时,上面的代码就显得比较多余了,那么接下来我们继续看看如何优雅的实现这些升级后的复制操作。
一、创建注解类及其接口
1、创建转换接口
public interface BeanConverter<T, R> {R convert(T t);
}
2、创建注解类
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Convert {boolean ignore() default false;String ref() default "";Class<? extends BeanConverter> converter() default BeanConverter.class;}
二、int和boolean之间的转换实现接口
1、int转boolean实现
public class IntegerToBooleanConverter implements BeanConverter<Integer, Boolean> {@Overridepublic Boolean convert(Integer integer) {return integer != null && integer == 1;}
}
2、boolean转int实现
public class BooleanToIntegerConverter implements BeanConverter<Boolean, Integer> {@Overridepublic Integer convert(Boolean boo) {return boo != null && boo ? 1 : 0;}
}