1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dromara-forest

 / Детали:

Статический внутренний класс коллекция Collection не может быть правильно сериализован в массив.

Предстоит сделать
Владелец
Создано  
11.03.2025

Используемый версионный Forest и используемые backend с версиями

<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot-starter</artifactId>
    <version>1.5.36</version>
</dependency>

Как была вызвана данная проблема?

Использование коллекционного члена переменной в статическом внутреннем классе, помеченном аннотацией @Body, привело к некорректной сериализации в виде [...] вместо правильного представления.

Шаги воспроизведения (если есть, то полностью)

Создайте API-интерфейс, запросные параметры и проведите тестирование.

Шаги воспроизведения:

  1. Создайте API-интерфейс.
  2. Определите запросные параметры.
  3. Выполните тестирование.

Ошибочное сообщение / полная лог-запрос (если нет лог-запроса, пожалуйста, включите его)

Запрос:

POST http://iip.yndsft.com/di-api/dacoo-api/openApi/exRedisManage/recentVal/batch?appKey=241230163120016500001&appSecret=cc2e452e911843b4bd3dac86d58b7e63 HTTP
Headers: 
User-Agent: forest/1.5.36
Body: attrId=12174089,12174091,12174093,12174095,12174097,12174099,12174101,12174103

Ответ от API-интерфейса:

{
    "code":"1003",
    "data":null,
    "message":"com.alibaba.fastjson.JSONException: syntax error, expect {, actual error, pos 0, fastjson-version 1.2.47",
    "possibleReason":null,
    "suggestMeasure":null,
    "traceId":null
}
```### Определение интерфейса (если необходимо предоставьте)
Класс API:
```java
@BaseRequest(baseURL = "http://iip.yndsft.com", interceptor = TagValueAccessInterceptor.class)
public interface TagDataAccessService {
    /**
     * Получение последних значений нескольких меток по их ID
     * Данные записываются на диск и последние значения кэшируются в системе Redis. Этот метод позволяет получить самые свежие данные с максимальной скоростью. По умолчанию можно запрашивать до 100 меток одновременно.
     *
     * @param tagAttributes
     * @return
     */
    @Post("/di-api/dacoo-api/openApi/exRedisManage/recentVal/batch")
    public <T> ApiResult<Map<String, TagValue<T>>> batchTagValueLatest(@Body TagValueAccessRequest.TagAttributes tagAttributes);
}
```### Класс запросных параметров:
```java
@Data
public class TagValueAccessRequest {
    @Getter
    @Setter
    public static class TagAttributes {
        /**
         * ID метки, обязательное поле при отсутствии глобального идентификатора метки
         */
        private Collection<Integer> attrId;
    }
}

Класс вызова:

/**
 * Получение текущего значения накопителя на конвейере
 * @param tagEnumList
 * @return
 */
public Map<String, TagValue<BigDecimal>> getBeltCumulantFlowLatest(Collection<TagEnum> tagEnumList) {

        // Набор значений: 12174071, 12174072, 12174073, 12174074, 12174075, 12174076, 12174077, 12174078
        Set<Integer> tagIdSet = tagEnumList.stream().map(tag -> Integer.parseInt(tag.getId())).collect(Collectors.toSet());
        TagValueAccessRequest.TagAttributes tagAttributes = new TagValueAccessRequest.TagAttributes();
        tagAttributes.setAttrId(tagIdSet);
        
        ApiResult<Map<String, TagValue<BigDecimal>>> result = this.tagDataAccessService.batchTagValueLatest(tagAttributes);
        log.info("Получение последних значений накопителя пневматического веса: {}", result);

        Map<String, TagValue<BigDecimal>> dataMap = result.getData();
        return dataMap;
    }

Комментарий (0)

GitLife Service Account Задача создана

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/dromara-forest.git
git@api.gitlife.ru:oschina-mirror/dromara-forest.git
oschina-mirror
dromara-forest
dromara-forest