我正在尝试解决MapStruct在我的对象中加载所有JPA引用的问题(即使它们被指定为FetchType.LAZY)。
我已经为我的mapper添加了一个方法,为每个方法“调用”,除了我真正想要它的那些方法,它们是任何“使用过的”映射器的getter 我在顶级映射器接口类上创建的方法如下:
default <T> T checkIt(T o) {
return o;
}
,我正在使用的映射方法的生成代码如下:
customerOrderDto.setStartDate( checkIt( customerOrder.getStartDate() ) );
customerOrderDto.setEndDate( checkIt( customerOrder.getEndDate() ) );
customerOrderDto.setCustomer( customerDtoMapper.toDto( customerOrder.getCustomer() ) );
customerOrderDto.setTopology( topologyDtoMapper.toDto( customerOrder.getTopology() ) );
正如您所看到的,它会为前两个(开始和结束日期)生成它,但对于其他两个(客户和拓扑),它们定义了自己的映射器(并且由此映射器使用),它不会叫它。
有没有办法让MapStruct为每个“get”的方法调用它?
如果我可以让它包装每个.get()方法,我应该有机会检查实体是否已经加载,并且还可能使用@JsonView视图映射过滤它。
答案 0 :(得分:0)
首先,MapStruct不会加载任何JPA引用。 MapStruct是一个注释处理器工具,可生成Java代码,然后您可以使用它来执行映射。
未使用checkIt
方法,因为有一种更具体的方法可用于执行映射(在customerDtoMapper
和topologyDtoMapper
中)。最重要的是,MapStruct在将映射传递给其他方法时不会执行映射。只有在相同的源类型和目标类型之间进行映射时,您的方法才会起作用。
但是,您可以执行的是在customerDtoMapper
和topologyDtoMapper
等其他地图制作工具中执行所需的检查。
您可以使用新的@Context
可能性和@BeforeMapping
方法返回非空值(然后立即从方法返回)。 @Context
可用于检查customerDtoMapper
是否需要进行检查。
您可以尝试将checkIt
方法设为@BeforeMappingMethod
。但是,当您尝试返回某种DTO而不是传递的源时,您需要更改签名。