Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取Spring boot中未映射到@RequestBody模型对象的其他JSON属性_Java_Spring Boot_Spring Restcontroller - Fatal编程技术网

Java 如何读取Spring boot中未映射到@RequestBody模型对象的其他JSON属性

Java 如何读取Spring boot中未映射到@RequestBody模型对象的其他JSON属性,java,spring-boot,spring-restcontroller,Java,Spring Boot,Spring Restcontroller,我有一个RestController,看起来像这样 @RequestMapping(value = "/post", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<?> test(@RequestBody User user) { System.out.println(user); return ResponseEntit

我有一个RestController,看起来像这样

@RequestMapping(value = "/post", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> test(@RequestBody User user) {

    System.out.println(user);
    return ResponseEntity.ok(user);
}     
{
"name": "abc",
"city": "xyz",
"state": "pqr",
"zip":"765234",
"country": "india"
}
我有一个要求,用户可以在输入JSON中传递一些额外的属性,类似这样

@RequestMapping(value = "/post", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> test(@RequestBody User user) {

    System.out.println(user);
    return ResponseEntity.ok(user);
}     
{
"name": "abc",
"city": "xyz",
"state": "pqr",
"zip":"765234",
"country": "india"
}
“zip”和“country”是输入JSON中的附加属性

在SpringBoot中,我们有没有办法在请求体中获得这些附加属性


我知道一种可以使用“Map”或“JsonNode”或“HttpEntity”作为Requestbody参数的方法。但是我不想使用这些类,因为我会丢失可在“User”模型对象内部使用的javax.validation。

使用
映射扩展
用户
DTO,并创建一个用
@JsonAnySetter
注释的setter。对于所有未知属性,将调用此方法

class User {

    private final Map<String, Object> details= new HashMap<>);

    @NotBlank
    private String name;
    private String city;
    private String state;

    @JsonAnySetter
    public void addDetail(String key, Object value) {
      this.details.add(key, value);
    }

    public Map<String, Object> getDetails() { return this.details; }
}
类用户{
私有最终映射详细信息=新HashMap);
@不空白
私有字符串名称;
私人城市;
私有字符串状态;
@JSONANYSETER
public void addDetail(字符串键、对象值){
此.details.add(键、值);
}
公共映射getDetails(){返回this.details;}
}

现在,您可以通过
getDetails()
获取所有其他信息

您可以更改用户类并添加此属性将
映射添加到用户对象以包含其他所有内容。创建包含键和值的setter,并使用
@JsonAnySetter
进行注释。用户不知道这些附加属性(名称和编号)API@M.Deinum我们不希望输入中有任何指向JSON的属性。用户不知道强制属性和额外属性。请实际阅读注释和答案。你可以用这个解决方案发布任何东西。我想验证地图的元素。我可以使用javax.validation,比如private final Map details=new HashMap);但我不知道这些属性的名称和值的类型。我将有一个元数据,其中可以包含类型信息以及可以对特定属性名进行何种验证。那么如何验证呢?您可能需要为此编写一个自定义约束验证器,因为这是一个非常特定的用例。