[BETA]使用DTO

警告! This is a new feature, of BETA quality. 使用它自己承担风险!反馈非常受欢迎!

介绍

默认情况下,JHipster直接在其REST端点中使用其域对象(通常是JPA实体)。这有很多好处,主要是它使代码易于使用,理解和扩展。

但是,对于复杂的用例,您可能希望使用将由REST端点公开的数据传输对象(或DTO)。这些对象在域对象之上添加了一个额外的层,并且针对REST层进行了专门的调整:它们的主要优点是可以聚合多个域对象。

How DTOs work in JHipster

生成JHipster实体时,您还可以选择为此实体生成DTO。如果选择该选项:

  • 将生成一个DTO,并将其映射到基础实体上。
  • 它将聚合多对一关系,仅使用用于使用AngularJS显示它的ID和字段。例如,与User实体的多对一关系将向DTO 添加一个userId字段和一个userLogin字段。
  • 它将忽略非所有者的一对多关系和多对多关系:这与实体工作的方式相匹配 (they have a @JsonIgnore annotation on those fields).
  • 对于一个多对多关系的实体:它将使用另一个实体的DTO ,并在其中使用它们 Set.因此,如果其他实体也使用DTO,这只能工作。

使用MapStruct映射DTO和实体 Using MapStruct to map DTOs and entities

由于DTO看起来很像实体,所以需要一个解决方案来自动映射它们是一个常见的要求。

JHipster中选择的解决方案是使用 MapStruct. 它是一个插入Java编译器的注释处理器,将自动生成所需的映射。

我们发现它非常干净和高效,并且喜欢它不使用反射(这在使用时像在mapper中一样重要)。

配置您的IDE for MapStruct Configuring your IDE for MapStruct

MapStruct是一个注释处理器,因此它也应该被设置为在IDE编译项目时自动运行。

如果您使用Maven,则需要IDE在IDE中激活maven配置文件。Gradle用户不需要应用任何IDE特定的。

激活配置文件的说明包括 Configuring your IDE.

高级MapStruct用法 Advanced MapStruct usage

MapStruct映射器被配置为Spring Bean,并支持依赖注入。一个很好的提示是,您可以将其注入Repository到映射器中,因此您可以使用其ID从映射器获取托管的JPA实体。

以下是一个示例代码,获取一个User 实体:

@Mapper
public 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);
    }
}

未来路线图 Future roadmap

将来,如果我们发现MapStruct对于每个人都不够,我们将添加另一个DTO映射器。最简单的解决方案是使用JHipster自动生成映射,而不使用任何第三方库。

results matching ""

    No results matching ""