想在自定义映射中引用其他映射器

时间:2019-10-23 05:18:22

标签: java mapstruct

我现在正在使用Mapstruct,并且想要创建一个映射,以便在映射之前,它需要验证给定的坐标是否在有效区域内。如果无效,则返回默认值,如果有效,则返回该值。

这就是我所拥有的

public class Business {

  ...
  Coordinate coordinate;

}
public class BusinessDTO {

  CoordinateDTO coordinate;

}
public class Coordinate {
  
double latitude;

  double longitude;

}
public class CoordinateDTO {

  double latitude;

  double longitude;
}
@Mapping(componentModel = "spring", uses = CoordinateMapper.class)

public interface BusinessMapper {

  BusinessDTO toDTO(Business business);
}
default CoordinateDTO getCoordinate(Coordinate coordinate) {

  if (valid(coordinate)) {
    
return getCoordinateMapper().toDTO(coordinate);
  
}
  
return defaultCoordinate;

}
@Mapping(componentModel = "spring")

public interface CoordinateMapper {

  CoordinateDTO toDTO(Coordinate coordinate);

}

问题是我不知道该怎么getCoordinateMapper()。一种方法是使用Mappers.getMapper(CoordinateMapper.class),但实际上我的ordinateMapper必须引用其他映射器。使用Mappers.getMapper(CoordinateMapper.class)使所引用的映射器为null,并导致NullPointerException。

有人建议如何处理吗?

2 个答案:

答案 0 :(得分:0)

您使用componentModel“ spring”表示生成的类将是spring Bean。

您只需将其注入需要进行映射的服务中即可。

否则,如果您不想注入它,则可能应该使用默认的组件模型。他们在文档中使用(see the reference guide

CustomerMapper INSTANCE = Mappers.getMapper( CustomerMapper.class );

答案 1 :(得分:0)

映射器是无状态的。因此,我们有上下文对象来处理逻辑(例如查找,但也包含验证)。为了不损害无状态概念,您可以通过@Context批注将它们交给。

如果在方法的顶部放置@AfterMapping,则MapStruct将选择该方法。通过将@Mapping设置为ignore来确保MapStruct不映射。

您可以向此@Context注释的类添加任何逻辑。


public class CoordinateValidator {

   @Inject
   private CoordinateMapper;

   @AfterMapping
   public void validateAndMaptoDTO(Business business, @MappingTarget BusinessDTO target) {
       if (valid(target.getCoordinate())) {
         
return getCoordinateMapper().toDTO(target.getCoordinate());
  
     }
  
     return defaultCoordinate
   }

}

@Mapping(componentModel = "spring")

public interface BusinessMapper {


  @Mapping( target = "coordinate", ignore = true )
  BusinessDTO toDTO(Business business, @Context CoordinateValidator validator);
}