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

时间:2018-11-28 18:13:05

标签: java spring-mvc coding-style

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

考虑以下代码段:

@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;
    }
}

我的问题是,直接在端点类中定义这些“响应”类是个好主意,还是为此类创建单独的文件更好?请记住,除单元测试之外,任何其他终结点都没有使用 AuthResponse 对象。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

不应在该类之外的任何地方使用Response DTO(请求DTO也是一样)。

在这种情况下,将它们用作Controller的静态内部类不仅是“好”的,而且是完全合理的。 话虽这么说,它们应该public(正如我们刚才谈到的范围),并且也不需要它们是程序包私有的,它们可以(并且应该)是{ {1}}类。