Как отправить тип экземпляра объекта Java в JSON на Java Spring-Server Post-запрос? - PullRequest
0 голосов
/ 31 января 2020

У меня есть базовый класс и три дополнительных класса. Например:

BaseClass:

public BaseClass {
 int id;
} 
public SubClass extends BaseClass {
 int sub1;
}
public SubClass2 extends BaseClass {
 int sub2;
}

Теперь я хочу отправить файл json на мой весенний сервер, и сервер должен проверить, является ли он подклассом -типа или тип SubClass2


    @PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> create(@RequestBody List<BaseClass> entry);

отправка JSON:

{
    "id": 1,
    "sub1": 1
},
{
    "id": 2,
    "sub2": 2
}

Я, за исключением Списка базовых классов, но пытаюсь привести их в указанный подкласс c. Как я могу это сделать? Следующее не сработало.

if (abc instanceof SubClass) {
                log.info("abc is instance of SubClass");
} else if (abc instanceof SubClass2) {
                log.info("abc is instance of SubClass2");
} 

1 Ответ

0 голосов
/ 31 января 2020

Если вы примете BaseClass Spring отобразит ваш json на соответствие только BaseClass, игнорируя все остальные поля. Таким образом, ваша проверка на подклассы не будет работать вообще.

Самое простое решение - принять данные в виде простого текста и после этого вручную попытаться сопоставить их с вашими моделями, используя GSON или что-то подобное, как это

new Gson().fromJson("{
    "id": 1,
    "sub1": 1
}", SubClass.class);

Но это плохой способ справиться с этим. Ваш подход должен быть изменен архитектурно. Самый простой способ сделать это - ввести data поле для вашей модели, подобной этой

{
    "id": 1,
    "data": {
         "key": "sub1",
         "value": 1
     },
},
public Data {
 String key;
 int value
} 

public BaseClass {
 int id;
 Data data;
} 

, таким образом вы сможете проверить

if (abc.data.key.equals("sub1")) {
                log.info("abc is sub1");
} else if (abc.data.key.equals("sub1")) {
                log.info("abc is sub2");
} 

Это потребует немного более сложная дальнейшая реализация, но она будет работать.

Надеюсь, это поможет.

...