2017-05-24 76 views
4

到目前为止,我已经使用Spring Boot完成了一个(REST)项目,并且非常喜欢它。我发现有点狡猾的一件事是我对@RequestBody的理解。我是否需要为Spring Boot中的每个@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返回其中例如密码被排除的用户对象的最小化版本。

这个问题的一些标准方法是什么?我真的必须为每个'json-view'创建一个单独的对象吗?我在Python中做了一些REST的东西,在这里我只需要一个包含请求属性的字典。任何类似的方法?

+0

您是否想忽略某个属性的值作为返回视图或作为请求读取的同一类? – Zico

回答

2

1)创建一个新的实体,如果你将持续或在其上

2)操作如果需要对现有的实体的自定义视图(添加/删除字段)与自定义序列DTO可使用

3)有些情况下,如果您不想创建DTO,因为您不会在任何地方重复使用它,但需要一些快速解决方案来实现您可以使用的自定义响应Map - 该键将用于JSON字段名称,Object为该值,例如:

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

第三届情况下会适合你,如果你不应该根据一些条件来定制嵌套对象建立过于复杂机构。反向使用第二个选项。

2

对此,有两种方法可用于请求和响应 -
1.使用具有额外参数的相同实体并仅填充所需内容。你可以检查空值。
2.使用单独的数据传输对象(DTO) - 当实体具有与需要传输的对象不同的字段时,可以使用它们。个人而言,我喜欢第一种方法来节省映射实体到DTOs的工作,然后回来。但是,有时候DTO需要完全不同,我们需要使用第二种方法。例如。仪表板号码和报告的API。

HTH

+0

不使用弹簧,但使用类似的框架。我决定使用一个DTO,其中每个属性都是一个字符串(即使它最终会成为数字或日期或实体上的其他内容)。因为如果验证失败,我希望能够重新显示无效条目。如果我将一个字段映射为日期并且用户输入'xyz',并且我重新显示带有验证错误的表单,我希望能够显示错误值并让它们编辑。不只是失去它。不确定春季是否会出现同样的问题? –

+0

@NicholasSmith这听起来更像是你应该有前端验证。然后,服务器端验证有意尝试传递错误数据(例如通过curl发送无效请求)。 – Kayaman

+0

是的,我不知道他是否在做客户端或服务器端验证,这就是为什么我提到它。 –

相关问题