在Spring Boot中,每个@RequestBody是否需要一个单独的对象

Kar*_*urg 5 java rest spring spring-mvc spring-boot

到目前为止,我已经使用Spring Boot完成了一个(REST)项目,并且非常喜欢它。我发现有些曲解是我对的理解@RequestBody

假设我有下面的POST方法来登录用户。我的用户实体可能包含除我希望发布请求后具有的用户名和密码之外的其他属性。在这种情况下,我看不到其他选择,只能创建一个额外的对象(LoginRequest)来保存传入数据的数据。

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> login(@RequestBody LoginRequest request) {
        User p = null;
        if (request != null) {
            p = User.login(request.getEmail(), request.getPassword()); // validates and returns user if exists
            if (p != null){
                return new ResponseEntity<User>(p, HttpStatus.OK);
            }
        }

        throw new IllegalArgumentException("Password or email incorrect");
    }
Run Code Online (Sandbox Code Playgroud)

同样,我想@ResponseBody返回一个最小化版本的User对象,例如,其中排除了密码。

解决此问题的标准方法有哪些?我真的必须为每个“ json-view”创建一个单独的对象吗?我之前在python中做了一些REST的工作,在这里我只是拥有一个包含请求属性的Dictionary。有类似的方法吗?

J-A*_*lex 5

  1. 如果您要持久化或对其进行操作,请创建一个新实体

  2. 如果您需要现有实体的自定义视图(添加/删除字段),可以使用带有自定义序列化的 DTO

  3. 可能有一种情况,您不想创建 DTO,因为您不会在任何地方重用它,但需要一些自定义响应的快速解决方案,您可以使用 Map<String, Object> - 键将用于 JSON 字段名称,并且对象是值,例如:

    @RequestMapping(method = RequestMethod.POST) public Map<String, Object> login(@RequestParam Integer p1) { Map<String, Object> map = new HashMap<>(); map.put("p1", p1); map.put("somethingElse", "456"); 返回地图;}

JSON 响应:

{
  "p1": p1value,
  "somethingElse": "456"
}
Run Code Online (Sandbox Code Playgroud)

如果您不使用嵌套对象构建过于复杂的主体,则第 3 种情况将适合您,这些对象应根据某些条件进行自定义。在相反的情况下使用第二个选项。