Java Spring WebClient 如何从 body 响应中获取属性并设置为给定的 class?
Java Spring WebClient how to get atribute from body response and set to a given class?
我正在尝试使用给定的 API returns 一个 body 响应,如下所示:
"access_token": "xkeo94s4qviHSTDIuTCbgRQSeNfrrMamiCN0w6wu",
"token_type": "Bearer",
"expires_in": 9600,
"refresh_token": "PpF0LfLPmdsm9FJFu4YmDBPENqTwGQIqQjw8MqOP"
所以我创建了以下 class:
@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
我可以使用以下代码发出请求并获得预期的响应 body:
@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 的响应并获取其属性时,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() 的概念?请问如何从响应 body 中获取属性并使用 WebClient 设置为给定的 class?
此致。
对于遇到此问题的任何人,我的问题是 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。
我正在尝试使用给定的 API returns 一个 body 响应,如下所示:
"access_token": "xkeo94s4qviHSTDIuTCbgRQSeNfrrMamiCN0w6wu",
"token_type": "Bearer",
"expires_in": 9600,
"refresh_token": "PpF0LfLPmdsm9FJFu4YmDBPENqTwGQIqQjw8MqOP"
所以我创建了以下 class:
@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
我可以使用以下代码发出请求并获得预期的响应 body:
@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 的响应并获取其属性时,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() 的概念?请问如何从响应 body 中获取属性并使用 WebClient 设置为给定的 class?
此致。
对于遇到此问题的任何人,我的问题是 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。