Как прочитать дополнительные атрибуты JSON, которые не сопоставлены с объектом модели @RequestBody при загрузке Spring - PullRequest
2 голосов
/ 11 февраля 2020

У меня есть 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);
}     

И модель пользователя, которая выглядит следующим образом

class User {

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

}

У меня есть требование, согласно которому пользователи могут передавать некоторые дополнительные дополнительные атрибуты ( s) во входных данных JSON что-то вроде этого

{
"name": "abc",
"city": "xyz",
"state": "pqr",
"zip":"765234",
"country": "india"
}

'zip' и 'country' являются дополнительными атрибутами во входных данных JSON.

Есть ли какой-нибудь способ в Spring Boot, где мы можем получить эти дополнительные атрибуты в теле запроса?

Я знаю способ, которым я могу использовать либо «Map», либо «JsonNode», либо «HttpEntity». msgstr "в качестве параметра Requestbody. Но я не хочу использовать эти классы, так как потерял бы javax.validation, который можно использовать внутри объекта модели «Пользователь».

1 Ответ

5 голосов
/ 11 февраля 2020

Расширьте свой User DTO с помощью Map<String, String> и создайте установщик с аннотацией @JsonAnySetter. Для всех неизвестных свойств этот метод будет вызван.

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; }
}

Теперь вы можете получить все остальное через getDetails().

...