Доступ к динамически добавленным свойствам в Spring @RequestBody - PullRequest
0 голосов
/ 23 октября 2019

У меня есть пост-отображение, как показано ниже:

@PostMapping(value = "/profiles/{profileId}/verify/")
public Response getVerificationInformation (
    @RequestBody VerificationBody body) {
    ... do something with the body
    ... call function A with body object
}

И позже в функции A я получаю доступ к объекту body для нескольких атрибутов.

Кроме того, в переднемВ конце я изменяю объект JSON (я добавляю другое свойство), который попадает в это пост-отображение.

Например,

{
    "name" : "Example",
    "profileId" : "123",
    // and I am dynamically adding an attribute 'country'
    "country" : "US"
}

Проблема в функции A, у меня нет средств для получения информации о динамически добавляемом атрибуте (в данном случае 'страна').

Объявление метода получения динамически добавляемых свойств не является идеальным, поскольку динамически добавляются многие свойства.

Я пробовал что-то в направлении @JsonAnySetter и @JsonAnyGetter, но получаю 400. И я ищудля других решений.

Пожалуйста, помогите и спасибо заранее! (Я упростил несколько имен переменных и функций, но я надеюсь, что это не так сложно понять).


VerificationBody можно представить себе так:

public class VerificationBody {
    @JsonProperty(value = "name")
    String name,
    @JsonProperty(value = "profileId")
    Long profileId,
    // ... it does not include country
}

Мне удалось устранить проблему 400, и я смог получить свойства через JsonAnyGetter и JsonAnySetter.

Ответы [ 5 ]

2 голосов
/ 23 октября 2019

Вы можете использовать HashMap что-то вроде этого для решения этой проблемы:

@RequestMapping(value = "/profiles/{profileId}/verify/", headers = "Accept=application/json", method = RequestMethod.POST)
public void verifyBody(@RequestBody HashMap<String, HashMap<String, String>> requestData) {

HashMap<String, String> customerInfo = requestData.get("verificationBody");
String param1 = customerInfo.get("param1");
//TODO now do whatever you want to do.
}
2 голосов
/ 23 октября 2019

Ваш класс VerificationBody может выглядеть примерно так:

class VerificationBody {
private String prop1;
//other properties & their getters and setter

private Map<String, ? extends Object> otherProps;
// getter setters for  otherProps

}

Это позволит вам всегда получать дополнительные свойства без каких-либо проблем с расширением.

1 голос
/ 23 октября 2019

Аннотация для тела запроса - @RequestBody. Поскольку тело запроса является парой ключ-значение, будет разумно объявить его как карту.

@PostMapping("/blog")
public Blog create(@RequestBody Map<String, String> body){...}

Чтобы извлечь соответствующие ключи и их значения:

String id = body.get("id");
String title = body.get("title");
String content = body.get("content");

Попробуйтес этой ссылкой

https://medium.com/better-programming/building-a-spring-boot-rest-api-part-ii-7ff1e4384b0b

0 голосов
/ 23 октября 2019

Вы можете попробовать изменить класс VerificationBody следующим образом:

public class VerificationBody {
    private String name;
    private Long profileId;

    // getters & setters
}

getVerificationInformation класс следующим образом:

@PostMapping(value = "/profiles/{profileId}/verify/",
             consumes = MediaType.APPLICATION_JSON_VALUE,
             produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Response getVerificationInformation (
    @RequestBody VerificationBody body) {
0 голосов
/ 23 октября 2019

Основная причина в том, что ваша строка JSON является недопустимой, допустимая должна выглядеть следующим образом:

{
  "name": "Example",
  "profileId": "123",
  "country": "US"
}

Убедитесь, что каждый ключ заключен в двойные кавычки, или выполучит 400 неверных запросов при сериализации тела запроса для вашего POJO с помощью Jackson.

Кстати, я использую Spring Boot и могу воспроизвести получение кода состояния HTTP 400 вашимфрагмент кода со неверной строкой JSON в качестве полезной нагрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...