创建DTO
来源:JHipster |
时间:2018-11-04
|
|

介绍

Jhipster默认在REST端点使用领域模型对象(典型的JPA实体)。这样做有很多好处,如易于使用、便于理解和扩展。

但是在一些复杂的场景,你也许想在REST的端点暴露出数据传输对象(DTOs)。这些对象将在domain对象上添加一些额外的东西,并专门针对REST进行优化:他们最大的好处就是可以将多个domain对象聚合起来使用。

DTOs在JHipster中如何工作

在生产JHipster实体的时候,你拥有一个添加Service层的选项:只有当你选择一个需要进行映射的Service层时DTOs选线才可以使用(当你使用的是JPA,由于service层具有事务,所以延迟加载会起作用)。

当你选择拥有service层时,你将会拥有从实体生成DTO的选项,如:

  • 一个基于当前实体映射的DTO将会被生成

  • 它将聚合多对一关系,仅使用ID和一个用于在客户端(如angular)显示的字段,因此,在一个基于User实体的多对一关系中将会添加一个userId和userLogin到DTO中。

  • 忽略一对多和多对多关系:这与实体的工作方式相似(在这些字段上具有一个@JsonIgnore

  • 对于所有者的多对多关系:它将使用来自其他实体的DTO,并将他们放在Set中,因此,只有在另一个实体也是用DTO的时候才能起作用。

使用MapStruct映射实体与DTOs

DTOs看起来很像一个实体,因此需要一个自动映射他们的解决方案。

JHipster选择的解决方案是使用MapStruct,它是一个注解处理器,在Java编译的时候自动的生成需要的映射。

我们发现,相对于反射而言,它干净而且高效。(使用反射进行映射的时候,对于性能而言比较糟糕)

在IDE中配置MapStruct

MapStruct是一个注解处理,当IDE编译项目的时候应该将它设置为自动运行。

如果你使用的士Maven,你需要在IDE中激活profile,gradle用户不需要进行任何设置。

如何激活Profile在“配置IDE”章节说明。

MapStruct的高级使用

MapStruct映射可以被配置为一个SpingBeans,并且支持依赖注入。你可以将Repository注入到映射中,就可以使用ID在Mapper中获取JPA实体。 如:

@Mapperpublic abstract class CarMapper {

    @Inject
    private UserRepository userRepository;    @Mapping(source = "user.id", target = "userId")    @Mapping(source = "user.login", target = "userLogin")    public abstract CarDTO carToCarDTO(Car car);    @Mapping(source = "userId", target = "user")    public abstract Car carDTOToCar(CarDTO carDTO);    public User userFromId(Long id) {        if (id == null) {            return null;
        }        return userRepository.findOne(id);
    }
}123456789101112131415161718192021


提交
查看更多评论
没有更多评论