Spring Boot中的每个@RequestBody都需要一个单独的对象吗?

时间:2017-05-24 14:44:08

标签: java spring rest 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");
    }

同样,我希望@ResponseBody返回User对象的最小化版本,例如密码被排除在外。

这个问题有哪些标准方法?我真的必须为每个&#39; json-view&#39;做一个单独的对象吗?之前我在python中做了一些REST东西,在这里我只有一个包含请求属性的Dictionary。任何类似的方法?

2 个答案:

答案 0 :(得分:2)

对于请求和响应,有两种方法 -
1.使用具有额外参数的相同实体,并仅填充您需要的内容。您可以检查空值 2.使用单独的数据传输对象(DTO) - 当实体具有与您需要传输的对象不同的字段时,基本上可以使用这些对象。

就个人而言,我喜欢第一种方法来节省将实体映射到DTO并返回的工作。但是,有时当DTO需要完全不同时,我们需要使用第二种方法。例如。仪表板编号和报告的API。

HTH

答案 1 :(得分:2)

1)如果您要坚持或操作新实体,请创建一个新实体

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

3)可能有一种情况,你不想创建DTO,因为你不会在任何地方重复使用它,但需要一些快速解决方案来自定义响应你可以使用Map - 该密钥将用于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");
        return map;
    }

JSON回复:

{
  "p1": p1value,
  "somethingElse": "456"
}

如果您没有使用嵌套对象构建过于复杂的主体,则应根据某些条件自定义第3个案例。反向使用第二个选项。