我有一个简单的 DTO 类。 电影
https://github.com/JonkiPro/REST-Web-Services/blob/master/common/src/main/java/com/common/dto/Movie.java该类具有 Builder 模式,要创建对象,您必须在构造函数中指定两个强制参数 title
和 type
。实体 MovieEntity
在此处映射到 DTO Movie
类 https://github.com/JonkiPro/REST-Web-Services/blob/master/core/src/main/java/com/core/jpa/service/ServiceUtils.java在 71
行内。 ServiceUtils 类不是 Spring 组件,而只是一个常规的 Utils 类。
我现在想要将登录用户的评级字段添加到 DTO Movie 类。
private Float yourRating;
对登录用户的评估将通过从 Spring Security 下载用户对电影的评分来获得
Float yourRating = movieSearchService.getRating(principalLoggedUser, movieId);
我无法使用 ServiceUtils
类中的 Builder
模式以任何方式设置 myRating
字段,因为该方法仅接受电影的实体。
我只能想到一种方法。
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字段。是不是看起来有点奇怪?或者也许您有其他想法?
最佳答案
定义与特定连接用户相关的信息的 Movie
类真的有意义吗?
从概念上讲,这些是不同的东西。
引入一个类作为 MovieUserRating
(使用或不使用 Builder)似乎是一个更好的选择,并且可能会解决您的问题。
在您的实际主张中,您失去了构建器模式的主要优点(不变性、线程安全、一致状态)。
我不确定在这种情况下将其保留为构建器是否有帮助。
作为替代方案,您可以重构 ServiceUtils
类以接受 toMovieDto()
的重载版本:
Float yourRating = movieSearchService.getRating(principalLoggedUser, movieId);
Movie movie = ServiceUtils.toMovieDtoWithRating(this.findMovie(id), yourRating);
通过这种方式,您仍然可以使用构建器模式以及要设置的附加属性。
关于java - 如果类具有我无法使用的构建器模式,如何正确设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49518658/