当前位置: 首页 > 知识库问答 >
问题:

Java Spring WebClient如何从body response获取atribute并设置为给定的类?

段超
2023-03-14

我试图使用一个给定的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的响应时。类并获取其atributes,则该类被实例化,但其所有atributes都为null。以下是我正在尝试的:

@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设置为给定的类?

当做

共有1个答案

程俊健
2023-03-14

对于任何有此问题的人,我的问题是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;

我将属性重命名为约定,并手动将json属性与@JsonProperty一起添加。

 类似资料:
  • 问题内容: 首先,我是一个新手,我正在尝试使用mediastore获取媒体文件的详细信息,并将详细信息保存在List中。这是我在做什么 在这里,我从内部和外部uri获取文件详细信息并将其保存在中。但是我无法获取特定列的详细信息。这就是我正在尝试的 我如何从另一个类或片段中的Item类获得以下详细信息作为数组。 问题答案: 您可以像这样获取数组项。例如,这是示例 如果要将数据设置为listview,

  • 问题内容: 将DataFrame设置为redis之后,再将其取回,redis返回一个字符串,但我想不出一种将该str转换为DataFrame的方法。 我该如何适当地做这两个? 问题答案: 组: 得到:

  • 问题内容: 我如何平均?我想找到的平均值,学生总数和的总数。例: 输入 :4 4 4 4 产出: 学生总数 :4 总GPA :16 平均GPA: 4 问题答案: 如果问题是您得到错误的答案,则原因是此循环: 大概您打算在用户输入负数时退出循环。这样做有问题,它将在总数和计数中包含负数。您可以这样重写循环: (其他解决方案也是可能的)。在代码的后面,您将需要防止第一个数字为负。如果发生这种情况,将为

  • 问题内容: 我们可以使用get本地时区名称,但该名称与不兼容。 实际上,返回的名称是不明确的。此方法在我的系统中返回,但是“ CST”可以指示四个时区: 中部时区(北美)-在北美中部时区观察 中国标准时间 中原标准时间-台湾现在很少使用“中原标准时间”一词 澳大利亚中央标准时间(ACST) 问题答案: 解决此问题的一种非常简单的方法: 更新 :@MartijnPieters说“这不适用于DST /

  • 因此,我有以下代码用于使用mediastore获取图像: 这是一个很好的获取图片文件夹中所有图片的工具,我想把它改为获取特定文件夹中的所有图片,这些图片将作为字符串传递。e、 g