ModelMapper, отображение списка объектов Entites в список объектов DTO
Я пишу простое веб-приложение для блога, используя Spring MVC Framework. Я готов добавить DTO
слой к моему приложению.
Я решил использовать ModelMapper Framework для конвертации из Entity
возражает против DTO
объекты, используемые в моих взглядах.
У меня только одна проблема. На моей главной странице я показываю список постов в моем блоге. На мой взгляд, это просто список Post
(Entity) объекты. Я хочу изменить его, чтобы передать список PostDTO
объекты на мой взгляд. Есть ли способ на карте List
из Post
возражает против List
из PostDTO
объект с единственным вызовом метода? Я думал о написании конвертера, который преобразует это, но я не уверен, что это хороший способ сделать это.
Также я использую Lists
из Entities
в нескольких местах, таких как административная панель или комментарий под каждым сообщением на моей странице.
Ссылка на код моего приложения в репозитории GitHub: репозиторий
1 ответ
Вы можете создать класс утилит:
public class ObjectMapperUtils {
private static ModelMapper modelMapper = new ModelMapper();
/**
* Model mapper property setting are specified in the following block.
* Default property matching strategy is set to Strict see {@link MatchingStrategies}
* Custom mappings are added using {@link ModelMapper#addMappings(PropertyMap)}
*/
static {
modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
}
/**
* Hide from public usage.
*/
private ObjectMapperUtils() {
}
/**
* <p>Note: outClass object must have default constructor with no arguments</p>
*
* @param <D> type of result object.
* @param <T> type of source object to map from.
* @param entity entity that needs to be mapped.
* @param outClass class of result object.
* @return new object of <code>outClass</code> type.
*/
public static <D, T> D map(final T entity, Class<D> outClass) {
return modelMapper.map(entity, outClass);
}
/**
* <p>Note: outClass object must have default constructor with no arguments</p>
*
* @param entityList list of entities that needs to be mapped
* @param outCLass class of result list element
* @param <D> type of objects in result list
* @param <T> type of entity in <code>entityList</code>
* @return list of mapped object with <code><D></code> type.
*/
public static <D, T> List<D> mapAll(final Collection<T> entityList, Class<D> outCLass) {
return entityList.stream()
.map(entity -> map(entity, outCLass))
.collect(Collectors.toList());
}
/**
* Maps {@code source} to {@code destination}.
*
* @param source object to map from
* @param destination object to map to
*/
public static <S, D> D map(final S source, D destination) {
modelMapper.map(source, destination);
return destination;
}
}
И используйте его для своих нужд:
List<PostDTO> listOfPostDTO = ObjectMapperUtils.mapAll(listOfPosts, PostDTO.class);
Учитывая , что у вас есть список Post Entity (postEntityList
) и класс PostDTO, вы можете попробовать следующее:
Type listType = new TypeToken<List<PostDTO>>(){}.getType();
List<PostDTO> postDtoList = modelmapper.mapper(postEntityList, listType);
Попробуйте следующий простой способ:
List<PostDTO> postDtoList = Arrays.asList(modelMapper.map(postEntityList, PostDTO[].class));
Так как вы хотите конвертировать Entity в Dto, вы можете попробовать следующий
List<PostDTO> entityToDto = modelMapper.map(postEntity, new TypeToken<List<PostDTO>>(){}.getType());
Предположим, вы читаете данные из базы данных и хотите преобразовать объекты в базе данных в DTO.
Уровень обслуживания может быть отделен от контроллера (всегда лучший подход), затем сделайте следующее:
Код уровня обслуживания:
@Override
public List<PostDTO> convertEntityToDTOList( ){
List<Post> post = postRepository.findAll();
Type listType = new TypeToken<List<PostDTO>>(){}.getType();
List<PostDTO> postDTOList = modelMapper.map(post, listType);
return postDTOList;
}
Затем в вашем контроллере добавьте это:
public ResponseEntity<?> list(){
List<PostDTO> postDTOList = iPost.convertEntityToDTOList();
return new ResponseEntity<>(postDTOList, HttpStatus.OK);
}
Обратите внимание, что iPost - это интерфейс, определяющий метод. Это оно:
public interface iPost {
List<PostDTO> convertEntityToDTOList();
}
Кредиты @André Carvalho