我现在正在使用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。
有人建议如何处理吗?
答案 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);
}