Search code examples
javaspringspring-webfluxspring-webclient

Cannot parse Google geocode json object via webclient


I try to call following webclient query:

    return webClient
            .get()
            .uri(uriBuilder -> uriBuilder
                    .path("/geocode/json")
                    .queryParam("key", google.getApiKey())
                    .queryParam("latlng", String.join(
                            ",",
                            String.valueOf(point.getLat()),
                            String.valueOf(point.getLng()))
                            )
                    .build())
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .onStatus(HttpStatus::isError, RestErrorHandler::manageError)
            .bodyToMono(*PlacesSearchResponse.class*);

REST operation from google returns (https://developers.google.com/maps/documentation/geocoding/overview#GeocodingResponses) following object:

    {
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            }            
         ],
         "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
         "geometry" : {
            "location" : {
               "lat" : 37.4224764,
               "lng" : -122.0842499
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 37.4238253802915,
                  "lng" : -122.0829009197085
               },
               "southwest" : {
                  "lat" : 37.4211274197085,
                  "lng" : -122.0855988802915
               }
            }
         },
         "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
         "plus_code": {
            "compound_code": "CWC8+W5 Mountain View, California, United States",
            "global_code": "849VCWC8+W5"
         },
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}

And problem is that I cannot parse it into my class: PlacesSearchResponse.class

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class PlacesSearchResponse {
    
        public String status;
        public String errorMessage;
        
    
        @JsonProperty(value = "results")
        public List<PlacesSearchResult> results;
    
    
    
    }

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class PlacesSearchResult implements  Serializable{
    
    private static final long serialVersionUID = 1L; 

    @JsonProperty(value = "address_components")
    public AddressComponent addressComponents[];
}

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class AddressComponent implements Serializable {
    
        private static final long serialVersionUID = 1L;
        public String longName;
        public String shortName;
    

        @JsonProperty(value = "types")
        public String[] types;
    
    
    }

I cannot find any mistake and webclient is ok, because when I tried bodyToMono(String.class) then I saw this object correctly.


Solution

  • Finnaly I have following call with objects:

    .bodyToMono(PlacesSearchResponse.class);
    
    
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class PlacesSearchResponse {
    
    public String status;
    public String errorMessage;
    
    List <PlacesSearchResult> results;
    
    }
    
    
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class PlacesSearchResult implements  Serializable{
    
    @JsonProperty("place_id")
    String placeId;
    
    @JsonProperty("address_components")
    List<AddressComponent> addressComponents;
    
    @JsonProperty("formatted_address")
    String formattedAddress;