'Receive array of objects in JSON by Spring Boot RestApi Controller

I want to send array of objects like this to Spring REST Controller:

{
    "measureList": [
        {
            "apiKey": "exampleKEY",
            "stationId": "abcdef123",
            "date": "2022-02-18T17:43:51.787535Z",
            "temp": "20.5",
            "humidity": "60.4",
            "pressure": "1020.5",
            "pm25": "100.0",
            "pm25Corr": "150.0",
            "pm10": "90.0"
        },
        {
            "apiKey": "exampleKEY",
            "stationId": "abcdef123",
            "date": "2022-02-18T17:43:53.254309Z",
            "temp": "20.5",
            "humidity": "60.4",
            "pressure": "1020.5",
            "pm25": "100.0",
            "pm25Corr": "150.0",
            "pm10": "90.0"
        }
    ]
}

I have created NewMeausurePackageDto like this:

package com.weather.server.domain.dto;

import java.util.ArrayList;
import java.util.List;

public class NewMeasurePackageDto {
    private ArrayList<NewMeasureDto> measureList;

    public NewMeasurePackageDto(ArrayList<NewMeasureDto> measureList) {
        this.measureList = measureList;
    }

    public NewMeasurePackageDto() {
    }

    public ArrayList<NewMeasureDto> getNewMeasureListDto() {
        return measureList;
    }

    @Override
    public String toString() {
        return "NewMeasurePackageDto{" +
                "measureList=" + measureList +
                '}';
    }
}

NewMeasureDto class:

package com.weather.server.domain.dto;

public class NewMeasureDto {
    private String apiKey;
    private String stationId;
    private String date;
    private String temp;
    private String humidity;
    private String pressure;
    private String pm25;
    private String pm10;
    private String pm25Corr;
    //station_id

    public NewMeasureDto() {
    }

    private NewMeasureDto(Builder builder){
        apiKey = builder.apiKey;
        stationId = builder.stationId;
        date = builder.date;
        temp = builder.temp;
        humidity = builder.humidity;
        pressure = builder.pressure;
        pm25 = builder.pm25;
        pm10 = builder.pm10;
        pm25Corr = builder.pm25Corr;
    }


    public String getApiKey() {
        return apiKey;
    }

    public String getStationID() {
        return stationId;
    }

    public String getDate() {
        return date;
    }

    public String getTemp() {
        return temp;
    }

    public String getHumidity() {
        return humidity;
    }

    public String getPressure() {
        return pressure;
    }

    public String getPm25() {
        return pm25;
    }

    public String getPm10() {
        return pm10;
    }

    public String getPm25Corr() {
        return pm25Corr;
    }


    public static final class Builder {
        private String apiKey;
        private String stationId;
        private String date;
        private String temp;
        private String humidity;
        private String pressure;
        private String pm25;
        private String pm10;
        private String pm25Corr;

        public Builder() {
        }

        public Builder apiKey(String apiKey) {
            this.apiKey = apiKey;
            return this;
        }

        public Builder stationID(String stationId) {
            this.stationId = stationId;
            return this;
        }

        public Builder date(String date) {
            this.date = date;
            return this;
        }

        public Builder temp(String temp) {
            this.temp = temp;
            return this;
        }

        public Builder humidity(String humidity) {
            this.humidity = humidity;
            return this;
        }

        public Builder pressure(String pressure){
            this.pressure = pressure;
            return this;
        }

        public Builder pm25(String pm25){
            this.pm25 = pm25;
            return this;
        }

        public Builder pm10(String pm10){
            this.pm10 = pm10;
            return this;
        }

        public Builder pm25Corr(String pm25Corr){
            this.pm25Corr = pm25Corr;
            return this;
        }

        public NewMeasureDto build() {
            return new NewMeasureDto(this);
        }
    }
}

And request mapping in RestController:

@PostMapping(value="/new-measure-package") //addStation id
    public ResponseEntity<Void> newMeasure(@RequestBody NewMeasurePackageDto measureList){
        //if api key is valid
        return measureService.saveMeasurePackage(measureList.getNewMeasureListDto()) ? new ResponseEntity<>(HttpStatus.OK) :
                new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }

With this code all I got is error about null measureList in Service function when trying to iterate over the list. I tried changing @RequestBody to List<NewMeasureDto> measureList, and to Map<String, NewMeasureDto> measureList but still measureList is null or empty.



Solution 1:[1]

Thanks to ShaharT suggestion I found the answer. There was missing setter in NewMeasurePackageDto, the class should look like this:

package com.weather.server.domain.dto;

import java.util.ArrayList;

public class NewMeasurePackageDto {
    private ArrayList<NewMeasureDto> measureList;

    public NewMeasurePackageDto(ArrayList<NewMeasureDto> measureList) {
        this.measureList = measureList;
    }

    public NewMeasurePackageDto() {
    }

    public ArrayList<NewMeasureDto> getMeasureList() {
        return measureList;
    }


    public void setMeasureList(ArrayList<NewMeasureDto> measureList) {
        this.measureList = measureList;
    }


    @Override
    public String toString() {
        return "NewMeasurePackageDto{" +
                "measureList=" + measureList +
                '}';
    }
}

Conclusion is: when dealing with object of arrays in JSON, there must be setter method for variable storing list in DTO.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 2meters