我有一个简单的DTO课程。 Movie
https://github.com/JonkiPro/REST-Web-Services/blob/master/common/src/main/java/com/common/dto/Movie.java此类有一个Builder模式,要创建一个对象,必须在构造函数titletype中指定两个强制性参数。实体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);


这样,您仍然可以使用带有附加属性的构建器模式进行设置。

07-28 02:32
查看更多