Search code examples
javaspringspring-bootresttemplaterest

Could not extract response in RestTemplate


I have a SpringBoot app. with this config file:

@Configuration
public class ApplicationConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM));
        restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);
        return restTemplate;
    }

}

and this class:

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(NON_NULL)
public class GeolocationAddress {

    private Integer placeId;
    private String licence;
    private String osmType;
    private Integer osmId;
    private List<String> boundingbox = null;
    private String lat;
    private String lon;
    private String displayName;
    private String _class;
    private String type;
    private Double importance;
    private Address address;
}

and this service:

public GeolocationAddress searchFromAddress(String address) {

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>(headers);

    return restTemplate.exchange("http://nominatim.openstreetmap.org/search?" + address, HttpMethod.GET, entity, GeolocationAddress.class).getBody();
}

but I have this error when running the service:

org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.bonansa.domain.GeolocationAddress] and content type [text/html]

    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:126)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:998)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:981)

Solution

  • It appears you’re missing format query param based on api doc.

    In your case i think it should be format=json

    https://nominatim.org/release-docs/develop/api/Search/

    Example copies from doc - JSON with address details

    https://nominatim.openstreetmap.org/?addressdetails=1&q=bakery+in+berlin+wedding&format=json&limit=1
        {
            "address": {
                "bakery": "B\u00e4cker Kamps",
                "city_district": "Mitte",
                "continent": "European Union",
                "country": "Deutschland",
                "country_code": "de",
                "footway": "Bahnsteig U6",
                "neighbourhood": "Sprengelkiez",
                "postcode": "13353",
                "state": "Berlin",
                "suburb": "Wedding"
            },
            "boundingbox": [
                "52.5460929870605",
                "52.5460968017578",
                "13.3591794967651",
                "13.3591804504395"
            ],
            "class": "shop",
            "display_name": "B\u00e4cker Kamps, Bahnsteig U6, Sprengelkiez, Wedding, Mitte, Berlin, 13353, Deutschland, European Union",
            "icon": "https://nominatim.openstreetmap.org/images/mapicons/shopping_bakery.p.20.png",
            "importance": 0.201,
            "lat": "52.5460941",
            "licence": "Data \u00a9 OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright",
            "lon": "13.35918",
            "osm_id": "317179427",
            "osm_type": "node",
            "place_id": "1453068",
            "type": "bakery"
        }