将过滤器函数应用于Mapstruct生成的映射

时间:2017-11-02 20:43:19

标签: mapstruct

我正在尝试解决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视图映射过滤它。

1 个答案:

答案 0 :(得分:0)

首先,MapStruct不会加载任何JPA引用。 MapStruct是一个注释处理器工具,可生成Java代码,然后您可以使用它来执行映射。

未使用checkIt方法,因为有一种更具体的方法可用于执行映射(在customerDtoMappertopologyDtoMapper中)。最重要的是,MapStruct在将映射传递给其他方法时不会执行映射。只有在相同的源类型和目标类型之间进行映射时,您的方法才会起作用。

但是,您可以执行的是在customerDtoMappertopologyDtoMapper等其他地图制作工具中执行所需的检查。

您可以使用新的@Context可能性和@BeforeMapping方法返回非空值(然后立即从方法返回)。 @Context可用于检查customerDtoMapper是否需要进行检查。

您可以尝试将checkIt方法设为@BeforeMappingMethod。但是,当您尝试返回某种DTO而不是传递的源时,您需要更改签名。