Хотите обратиться к другим картостроителям в настраиваемом картографировании - PullRequest
0 голосов
/ 23 октября 2019

Я сейчас использую 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), но на самом деле мой координатор координат должен ссылаться на другие преобразователи. Использование Mappers.getMapper(CoordinateMapper.class) делает указанные преобразователи пустыми и вызывает исключение NullPointerException.

Есть предложения, как с этим справиться?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Картографы не имеют статуса. Таким образом, у нас есть объекты контекста для обработки логики (например, поиск, но также и проверка). Чтобы не подвергать риску концепцию без сохранения состояния, вы передаете их через аннотацию @Context.

Если вы положите @AfterMapping поверх метода, MapStruct выберет этот метод. Убедитесь, что MapStruct не отображает, поместив @Mapping с игнорированием.

Вы можете добавить любую логику, которую хотите, в этот аннотированный класс @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);
}

0 голосов
/ 28 октября 2019

Вы используете componentModel "spring", это означает, что сгенерированные классы будут Spring Bean.

Вам просто нужно внедрить его в сервис, который должен выполнить отображение.

В противном случае, если вы не хотите внедрять его, вам, вероятно, следует использовать модель компонентов по умолчанию. В документации, которую они используют ( см. Справочное руководство )

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