0

我正在尝试使用返回如下正文响应的给定 API:

"access_token": "xkeo94s4qviHSTDIuTCbgRQSeNfrrMamiCN0w6wu",
"token_type": "Bearer",
"expires_in": 9600,
"refresh_token": "PpF0LfLPmdsm9FJFu4YmDBPENqTwGQIqQjw8MqOP"

所以我创建了以下类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class EHTLToken {

    private String access_token;
    
    private String token_type;
    
    private String expires_in;
    
    private String refresh_token;

// getters and setters

我可以使用以下代码发出请求并获得预期的响应正文:

@Test
    void getTokenTest() {
        
        String uri = "/oauth/access_token";
        EHTLClient client = new EHTLClient();
        Credenciais credenciais = new Credenciais();        

        RequestHeadersSpec<?> request = client.getWebClient().method(HttpMethod.POST).uri(uri).bodyValue(credenciais);
        String response = request.retrieve().bodyToMono(String.class).block();
        
        System.out.println(response);
    }

但是当我尝试检索对 EHTLToken.class 的响应并获取它的属性时,该类被实例化,但它的所有属性都是空的。这是我正在尝试的:

@Test
    void getTokenTest() {
        
        String uri = "/oauth/access_token";
        EHTLClient client = new EHTLClient();
        Credenciais credenciais = new Credenciais();        

        RequestHeadersSpec<?> request = client.getWebClient().method(HttpMethod.POST).uri(uri).bodyValue(credenciais);
        EHTLToken response = request.retrieve().bodyToMono(EHTLToken.class).block();
        
        Assert.notNull(response, "Class is null.");
        Assert.notNull(response.getAccessToken(), "Token is null.");
    }

我的第二次测试失败:

java.lang.IllegalArgumentException: Token is null.
    at org.springframework.util.Assert.notNull(Assert.java:198)
    at br.com.ribeiro.fernando.ehtl.EhtlApplicationTests.getTokenTest(EhtlApplicationTests.java:27)

我误解了 bodyToMono() 的概念吗?请问如何从响应正文中获取属性并使用 WebClient 设置为给定的类?

问候。

4

1 回答 1

0

对于遇到此问题的任何人,我的问题是 REST API 会给出如下响应:

"access_token": "xkeo94s4qviHSTDIuTCbgRQSeNfrrMamiCN0w6wu",
"token_type": "Bearer",
"expires_in": 9600,
"refresh_token": "PpF0LfLPmdsm9FJFu4YmDBPENqTwGQIqQjw8MqOP"

我创建了具有以下属性的 POJO:

private String access_token;    
private String token_type;    
private String expires_in;    
private String refresh_token;

当我将 POJO 更改为此时,我的测试有效:

@JsonIgnoreProperties(ignoreUnknown = true)
public class EHTLToken {

    @JsonProperty("access_token")
    private String accessToken;
    
    @JsonProperty("token_type")
    private String tokenType;
    
    @JsonProperty("expires_in")
    private String expiresIn;
    
    @JsonProperty("refresh_token")
    private String refreshToken;

我将属性重命名为约定,并使用@JsonProperty 手动添加了 json 属性。

于 2020-07-28T16:16:02.960 回答