我正在使用Spring MVC框架编写简单的博客Web应用程序。我愿意将DTO
图层添加到我的应用中。
我决定使用ModelMapper框架将Entity
个对象转换为我视图中使用的DTO
个对象。
我只有一个问题。
在我的主页上,我正在显示我博客上的帖子列表。在我看来,它只是Post
(实体)对象的列表。我想更改它以将PostDTO
个对象列表传递给我的视图。有没有办法通过单一方法调用将List
Post
个List
个对象映射到PostDTO
个Lists
对象?
我正在考虑编写converter来转换它,但我不确定这是一个很好的方法。
此外,我正在Entities
n
a
使用q
更多地方,例如管理面板或评论页面下方的每个帖子。
在GitHub存储库上链接到我的应用代码:repository
答案 0 :(得分:7)
考虑到你有后实体的列表(postEntityList
)和PostDTO类,你可以尝试以下操作:
Type listType = new TypeToken<List<PostDTO>>(){}.getType();
List<PostDTO> postDtoList = modelmapper.map(postEntityList, listType);
答案 1 :(得分:6)
您可以创建util class:
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);
答案 2 :(得分:3)
尝试以下简单方法:
List<PostDTO> postDtoList = Arrays.asList(modelMapper.map(postEntityList, PostDTO[].class));
答案 3 :(得分:0)
由于您要将Entity转换为Dto,因此可以尝试以下操作
List<PostDTO> entityToDto = modelMapper.map(postEntity, new TypeToken<List<PostDTO>>(){}.getType());
答案 4 :(得分:0)
假设您正在从数据库中读取数据,并希望从数据库中的实体转换为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的积分