我有一个简单的DTO课程。 Movie
https://github.com/JonkiPro/REST-Web-Services/blob/master/common/src/main/java/com/common/dto/Movie.java此类具有Builder模式,要创建对象,必须在构造函数title
和type
中指定两个必需参数。实体MovieEntity
已映射到行Movie
内的71
班https://github.com/JonkiPro/REST-Web-Services/blob/master/core/src/main/java/com/core/jpa/service/ServiceUtils.java。 ServiceUtils类不是Spring组件,而只是常规的Utils类。
我现在想要为登录用户添加一个评级字段到DTO电影课程。
private Float yourRating;
登录用户的评估将通过下载用户'来获得。来自Spring Security的电影评级
Float yourRating = movieSearchService.getRating(principalLoggedUser, movieId);
我无法使用myRating
类中的Builder
模式以任何方式设置ServiceUtils
字段,因为该方法仅接受电影的实体。
只有一种方法我可以想到它。
public Movie getMovie(
@Min(1) final Long id
) throws ResourceNotFoundException {
log.info("Called with id {}", id);
Movie movie = ServiceUtils.toMovieDto(this.findMovie(id));
movie.setYourRating(movieSearchService.getRating(principalLoggedUser, movieId));
return movie;
}
在Builder模式的帮助下,您如何看待DTO对象集的基本数据,然后使用setter设置YourRating字段。它看起来有点奇怪吗?或许你有另一个想法?
答案 0 :(得分:0)
将Movie
类定义为与特定连接用户相关的信息是否真的有意义?
从概念上讲,这些是不同的东西。
引入一个类MovieUserRating
(使用或不使用Builder)似乎是一个更好的选择,可能会解决您的问题。
在您的实际主张中,您失去了构建器模式的主要优点(不变性,线程安全性,一致状态)。
我不确定在这些条件下保持它是一个建设者是有帮助的
作为替代方案,您可以重构ServiceUtils
类以接受toMovieDto()
的重载版本:
Float yourRating = movieSearchService.getRating(principalLoggedUser, movieId);
Movie movie = ServiceUtils.toMovieDtoWithRating(this.findMovie(id), yourRating);
通过这种方式,您仍然可以使用构建器模式以及其他属性进行设置。