Как ограничить полезную нагрузку JSON от дополнительных полей с помощью Spring? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть базовый класс DTO пользователя ...

public class User {

  @JsonProperty("firstName")
  private String firstName;

  @JsonProperty("lastName")
  private String lastName;
}

... и базовый обработчик запросов в классе @RestController:

@RequestMapping(path = "/users", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE })
public UserMessage createUser(@RequestBody User user){
   return userService.createUser(user);
}

Как я могу ограничить входящиеПолезные нагрузки JSON, которые содержат максимум только необходимые ключи?т.е. принять эту полезную нагрузку:

{
  "firstName":"foo",
  "lastName":"bar"
}

И сгенерировать специальное исключение для этого:

{
  "firstName":"foo",
  "lastName":"bar",
  "type":"admin",
  "asdf":"asdf"
}

Я читал о пользовательских конвертерах, ArgumentResolvers, и я считаю, что я мог бы просто добавить дополнительный параметр Mapв обработчике и проверьте перед вызовом службы, однако я хотел бы знать, "лучший" способ решения этой проблемы.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Что касается компонента User в вашем примере, он также уже не возможен , что потенциальные другие поля JSON, кроме firstName и lastName, могут быть отображены просто потому, что в * 1006 нет полей* которые могут содержать релевантные данные.

Если бин User в вашем вопросе будет неполным, например, из соображений простоты, и содержать больше полей, то также все должно быть хорошо, если вы этого не сделалинастройте свой ObjectMapper с помощью com.fasterxml.jackson.databind.DeserializationFeature # FAIL_ON_UNKNOWN_PROPERTIES => false или используйте аннотацию @JsonIgnoreProperties(ignoreUnknown = true) для вашего компонента.

Подводя итог: поведение Джексона по умолчанию FAIL_ON_UNKNOWN_PROPERTIES (default: true)

Для получения дополнительной информации вы также можете обратиться к соответствующим документам по десериализации .

0 голосов
/ 01 апреля 2019

Решил вопрос, эта ветка помогла @ JsonIgnoreProperties (ignoreUnknown = false) не работает в Spring 4.2.0 и более поздних версиях

mle, ваш ответ не был верным, так как я использовал последнюю версию Spring Framework, а ObjectMapper FAIL_ON_UNKNOWN_PROPERTIES по умолчанию отключен. Кроме того, мне нужно было установить @JsonIgnoreProperties(ignoreUnknown = false) в моем классе DTO пользователя (так как суперкласс фактического класса имел значение true).

Протестировано, работает как чудо, в то время как пользовательские ошибки могут обрабатываться в аннотированном обработчике @ExceptionHandler(HttpMessageNotReadableException.class).

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