Spring Boot @RestController динамически принимает @RequestBody объекта компонента другой структуры и проверяет запрос

#java #rest #spring-boot

#java #rest #spring-boot

Вопрос:

В Spring Boot я пытаюсь создать @RestController , который должен принимать другую структуру @RequestBody и проверять компонент с помощью @Valid аннотации.

Я проверил пару вариантов, таких как создание тела запроса String Map и JSON структуры, но в этих вариантах я не могу использовать javax.validation.Valid аннотации.

Моя схема тела запроса приведена ниже

Схема 1

 {
  "type": "type1",
  "message": "String value"
}
  

Схема 2

 {
  "type": "type2",
  "message": [
    {
      "key1": "value",
      "key2": "value"
    },
    {
      "key1": "value",
      "key2": "value"
    }
  ]
}
  

На основе type ключа в ключе запроса message содержится другое значение структуры. В схеме 1 message ключ имеет String значение, а в схеме 2 message ключ имеет List of Object значение

Я ищу наилучший подход для обработки описанного выше сценария с включенной проверкой компонента с @Valid помощью аннотации

Любая помощь будет высоко оценена. Спасибо!

Ответ №1:

вы можете сделать это на уровне компонента.

Нравится

 @NotNull
@Size(min=2, max=30)
private String name;
  

см. Ссылки ниже

https://spring.io/guides/gs/validating-form-input/

https://www.baeldung.com/spring-boot-bean-validation

для переключения с одного компонента на другой вы можете использовать регистр переключения или добавить @Valid на уровне сервиса вместо уровня контроллера rest (API) после получения типа компонента.

 public methodName(@Valid ObjectName object){
.....
}
  

В Bean вы можете объявить

тип типа данных;

@сообщение допустимого типа данных;

затем вы делаете то же самое в сообщении с именем bean.

Ответ №2:

Это невозможно с использованием реализации spring по умолчанию. Вы должны сделать это самостоятельно, создав пользовательский класс, который принимает объект обоих типов (строка, список объектов), затем вы должны написать свою собственную аннотацию для проверки этого.