可以将 Spring MVC 响应 DTO 声明为静态嵌套 类 吗?

Is it okay to declare Spring MVC response DTOs as static nested classes?

有时在为您的 Web 应用程序设计 RESTful API 时使用 Spring MVC 自动对象-JSON 转换功能非常方便。要使用此功能,需要定义一个将被序列化的自定义 class。

考虑这段代码:

@RestController
public class ClientLogin {

    @PostMapping("/auth/password")
    public AuthResponse doPasswordLogin(@RequestParam String username, @RequestParam String password) {
        ...
        return new AuthResponse("test username", "test accessToken", "test sessionToken");
    }

    @PostMapping("/auth/token")
    public AuthResponse doTokenLogin(@RequestParam String username, @RequestParam String token) {
        ...
        return new AuthResponse("test username", "test new accessToken", "test sessionToken");
    }

    @RequiredArgsConstructor
    @Getter
    public static class AuthResponse {
        private final String username;
        private final String accessToken;
        private final String sessionToken;
    }
}

我的问题是,直接在端点 classes 中定义这些 "response" classes 是个好主意,还是为此类创建单独的文件更好class是吗?请记住,除单元测试外,AuthResponse 对象未被任何其他端点使用。

在实际项目中,您需要将来自业务层的模型映射到表示层模型(在您的情况下是 AuthResponse)。此映射应该经过单元测试,为了在测试中访问 AuthResponse,您需要通过 import <package_name>.ClientLogin.AuthResponse 在导入中指定 ClientLogin 控制器。我建议您尽可能保持代码分离。

如果您考虑这些 DTO 的职责和范围,这些 DTO 仅在 Controller 中使用 class。

不应在 class 以外的任何地方使用响应 DTO(请求 DTO 也是如此)。

在那种情况下,不仅“可以”,而且完全有理由将它们用作控制器的静态内部 classes。 话虽这么说,他们应该 而不是 public (正如我们刚刚谈到的范围),也不需要他们是包私有的,他们可以(并且应该) ) 是 private static classes.