Home > database >  How do I receive a dto, with a map as one of it's atributes, as a parameter of my controller? (
How do I receive a dto, with a map as one of it's atributes, as a parameter of my controller? (

Time:06-02

When I try to send it, it show me the "error": "Bad Request", "trace": "...HttpMessageNotReadableException: JSON parse error: Cannot deserialize Map key of type java.time.LocalDate from String "quoteDate": Failed to deserialize java.time.LocalDate"

The JSON I am sending via postman:

{
    "stockId":"test3",
    "quotes":[
        {
        "quoteDate":"2003-05-14",
        "quoteValue":"35.9"
        },
        {
        "quoteDate":"2016-03-28",
        "quoteValue":"55.0"
        }
    ]
}

The controller:

@PostMapping("/stock/save")
    public void saveQuotes(@RequestBody StockDTO stockDTO) {
        System.out.println(stockDTO.toString());
    }

The DTO

public class StockDTO {
    String id;
    String stockId;
    Map<LocalDate, Double> quotes;
}

CodePudding user response:

For quotes, the data type that should come as per the json string is a List. but was given a Map in the DTO.
The DTO should be ::

import com.google.gson.Gson;

import java.util.List;

public class GsonMappingExample {
    public static void main(String[] args) {
        String jsonString = "{\"stockId\":\"test3\",\"quotes\":[{\"quoteDate\":\"2003-05-14\",\"quoteValue\":\"35.9\"},{\"quoteDate\":\"2016-03-28\",\"quoteValue\":\"55.0\"}]}";
        Gson gson = new Gson();
        StockDTO stockDTO = gson.fromJson(jsonString, StockDTO.class);
        System.out.println(stockDTO);
    }
}

class StockDTO {
    private final String stockId;
    private final List<Quote> quotes;

    public StockDTO(String stockId, List<Quote> quotes) {
        this.stockId = stockId;
        this.quotes = quotes;
    }

    @Override
    public String toString() {
        return "StockDTO{"  
                "stockId='"   stockId   '\''  
                ", quoteList="   quotes  
                '}';
    }
}

class Quote {
    private final String quoteDate;
    private final Double quoteValue;

    public Quote(String quoteDate, Double quoteValue) {
        this.quoteDate = quoteDate;
        this.quoteValue = quoteValue;
    }

    @Override
    public String toString() {
        return "Quote{"  
                "quoteDate="   quoteDate  
                ", quoteValue="   quoteValue  
                '}';
    }
}

PS: Here I'm using Gson library to parse the json string, spring-boot automatically does that (using Jackson library I think!)

  • Related