Spring @RequestBody没有使用pojo?

the*_*mer 2 java spring pojo gson

我正在使用Spring Boot,我在我的控制器中有一个这样定义的方法

@PostMapping("/update)
public void update(@RequestBody User user) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是在我的客户请求(例如前端或邮递员)中,我有这样的事情:

{
    "firstName" : "John",
    "lastName" : "Doe",
    "id" : 1234,
    "metaInfoId" : "5457sdg26sg4636"
}
Run Code Online (Sandbox Code Playgroud)

事情是我的用户pojo只有firstName,id并且lastName实例字段在其中.但是在我的请求中我have to send metaInfoId也有其他一些需求.那么如何在上面的控制器方法中检索或分离metaInfoIdUser建模呢?

我是否必须创建另一个调用的模型类UserModelRequest并将所有User字段与字段一起添加metaInfoId然后使用@RequestBody?有没有办法简单地metaInfoId从请求中删除,然后采取其他一切并将其转储到Userpojo?例如,您可以在nodejs中轻松完成此操作(只需拼接您的对象并获取所需内容).

那么有没有办法在java spring中完成它而不必创建另一个模型类?

mad*_*fox 6

您可以注释您的POJO,@JsonIgnoreProperties(ignoreUnknown = true)以便忽略它不包含的字段.防爆

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String firstName;
    private String lastName;

    ... getters & setters ...
}
Run Code Online (Sandbox Code Playgroud)

此外,您不应在休息请求的正文中包含元数据.这些信息的正确位置将在标题中.这会将您的方法签名更改为:

@PostMapping("/update)
public void update(@RequestBody User user, @RequestHeader(value="metaInfoId") String metaInfoId) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您必须在请求中添加信息,那么您需要更新User pojo类以包含此字段(或者让它使用metaInfoId字段扩展类)

最后,您真的不想创建新类型.您可以更改签名以接受地图并检索必要的信息,如:

@PostMapping("/update)
public void update(@RequestBody Map<String, Object> userMap) {
    String metaInfoId = userMap.get("metaInfoId");

    ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper
    final User user = mapper.convertValue(userMap, User.class);
}
Run Code Online (Sandbox Code Playgroud)

  • 为了完整性,我又添加了一个选项 (2认同)