Java 如何读取Spring boot中未映射到@RequestBody模型对象的其他JSON属性
我有一个RestController,看起来像这样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
@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);但我不知道这些属性的名称和值的类型。我将有一个元数据,其中可以包含类型信息以及可以对特定属性名进行何种验证。那么如何验证呢?您可能需要为此编写一个自定义约束验证器,因为这是一个非常特定的用例。