如何在spring Boot 中将rest调用的响应转换为外部API到java dto?

j2cgzkjk  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(165)

我使用webclient是为了从我的spring Boot 应用程序调用一个外部api。我能够得到一个响应,但当我将其转换为dto时,所有值都为null。这是dto:

public class AddressResponse {
private String street;
private String line1;
private String line2;
private String postcode;
private String country;
}

这是进行调用的服务中的方法:

public AddressResponse resolveAddress(AddressRequest addressRequest) {
    return webClient.get()
            .uri(uriBuilder -> uriBuilder
            .queryParam("text", addressRequest.getSearchTerm())
            .queryParam("apiKey", apiKey)
            .build())
            .retrieve()
            .bodyToMono(AddressResponse.class)
            .block();
}

这是当我使用postman并手动对外部API进行get调用时的响应:

"results": [
    {
        "datasource": {
            "sourcename": "openstreetmap",
            "attribution": "© OpenStreetMap contributors",
            "license": "Open Database License",
            "url": "https://www.openstreetmap.org/copyright"
        },
        "name": "Bermondsey",
        "country": "United Kingdom",
        "country_code": "gb",
        "state": "England",
        "county": "Greater London",
        "city": "London"

我做错了什么?
谢谢

kkih6yb8

kkih6yb81#

响应没有正确Map,因为AddressResponse中的字段实际上嵌套在另一个JSON对象中。
您可以创建一个包含"results"列表的附加类。

public class AddressRootResponse {
    private List<AddressResponse> results;
        
    public List<AddressResponse> getResults {
        return this.results;
    }
        
    public void setResults(List<AddressResponse> results) {
        this.results = results;
    }
}

当然,当你调用API时,你需要将给定的类从AddressResponse.class更改为AddressRootResponse.class

6ie5vjzr

6ie5vjzr2#

我可以给予你代码,但我认为你可以了解JSON结构。并使用在线工具“Json to POJO”了解更多信息

相关问题