spring RestTemplate和反序列化嵌套列表

4nkexdtk  于 2023-03-16  发布在  Spring
关注(0)|答案(1)|浏览(103)

这是我的类,我想用RestTemplateMap到对象。我知道这不是最好的设计,但无论如何。Map只会像返回空保留数组的LockerReservations一样深。当列表中有保留时,它甚至不会Map它们。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LockerReservations {
    Locker locker;
    List<Reservation> reservations;
}
[
    {
        "locker": {
            "id": 0,
            "size": "S"
        },
        "reservations": []
    },
    {
        "locker": {
            "id": 1,
            "size": "S"
        },
        "reservations": []
    },
    {
        "locker": {
            "id": 4,
            "size": "S"
        },
        "reservations": [
            {
                "id": 17,
                "start": "2023-03-14T06:37:07.006",
                "end": "2023-03-14T12:37:07.006",
                "user": {
                    "id": 1,
                    "name": "Kiemoon"
                },
                "locker": {
                    "id": 4,
                    "size": "S"
                }
            },
            {
                "id": 36,
                "start": "2023-03-14T14:37:07.006",
                "end": "2023-03-14T15:37:07.006",
                "user": {
                    "id": 1,
                    "name": "Kiemoon"
                },
                "locker": {
                    "id": 4,
                    "size": "S"
                }
            }
        ]
    }

这是我使用RestTemplate的方法:

public List<LockerReservations> getReservationsCheck2(Size size, LocalDateTime start, LocalDateTime end) {

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        Map<String, Object> sizeTimeMap = new HashMap<>();
        sizeTimeMap.put("size", size.toString());
        sizeTimeMap.put("start", start.toString());
        sizeTimeMap.put("end", end.toString());
        HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(sizeTimeMap, httpHeaders);
        LockerReservations[] exchange = restTemplate.postForObject(url + "reservationsCheck", httpEntity, LockerReservations[].class);
        return Arrays.asList(exchange);
    }

如何获得完全反序列化?

ahy6op9u

ahy6op9u1#

我是这样做的:

public List<LockerReservations> getReservationsCheck(Size size, LocalDateTime start, LocalDateTime end) throws JsonProcessingException {

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    Map<String, Object> sizeTimeMap = new HashMap<>();
    sizeTimeMap.put("size", size.toString());
    sizeTimeMap.put("start", start.toString());
    sizeTimeMap.put("end", end.toString());
    HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(sizeTimeMap, httpHeaders);
    String str = restTemplate.postForObject(url + "reservationsCheck", httpEntity, String.class);
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    JavaType type = objectMapper.getTypeFactory().constructCollectionType(List.class, LockerReservations.class);
    List<LockerReservations> lockerReservationsList = objectMapper.readValue(str, type);
    return lockerReservationsList;
}

相关问题