我有一个简单的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
中此处https://github.com/JonkiPro/REST-Web-Services/blob/master/core/src/main/java/com/core/jpa/service/ServiceUtils.java的DTO 71
类。 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对象的基本数据,然后使用设置器设置yourRating字段。看起来有点奇怪吗?也许您还有其他想法?
最佳答案
定义Movie
类与特定连接用户有关的信息真的有意义吗?
从概念上讲,这些是不同的东西。
将类引入为MovieUserRating
(是否使用Builder)似乎是一个更好的选择,并且可能可以解决您的问题。
在您的实际命题中,您失去了构建器模式的主要优点(不变性,线程安全性,一致状态)。
我不确定在这种情况下将其保留为建设者会有所帮助。
或者,您可以重构ServiceUtils
类以接受toMovieDto()
的重载版本:
Float yourRating = movieSearchService.getRating(principalLoggedUser, movieId);
Movie movie = ServiceUtils.toMovieDtoWithRating(this.findMovie(id), yourRating);
这样,您仍然可以使用带有附加属性的构建器模式进行设置。