[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自动生成映射,而不使用任何第三方库。