java - 如果类具有我无法使用的构建器模式,如何正确设置变量

标签 java spring spring-mvc spring-boot

我有一个简单的 DTO 类。 电影 https://github.com/JonkiPro/REST-Web-Services/blob/master/common/src/main/java/com/common/dto/Movie.java该类具有 Builder 模式,要创建对象,您必须在构造函数中指定两个强制参数 titletype。实体 MovieEntity 在此处映射到 DTO Moviehttps://github.com/JonkiPro/REST-Web-Services/blob/master/core/src/main/java/com/core/jpa/service/ServiceUtils.java71 行内。 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/

相关文章:

spring-mvc - 如何使用 Spring MVC 和 Spock 使用 PUT 请求进行多部分单元测试?

java - 我的 URL 映射出了什么问题?

java.lang.NoSuchFieldError : INSTANCE

java - 使用 RESTish Web 服务时的 Web 应用程序 session

java - Nextpeer LibGdx 错误

java - 无法使用 java 小程序在 MAC 上创建文件和文件夹 - 不允许操作

java - MessageSource 始终返回默认消息

java - 如何在 Spring MVC 中从 Controller 调用组件或服务

java - 派生查询不适用于 DBRef

java - 使用正则表达式验证密码(包含字母和数字以及特殊字符)。{8,}